병원이 1차(동네의원) 2차 3차(대학병원급)로 나뉘고, 재판소(법원)가 지방-고등-대 3계층으로 나뉘고..
금융기관도 제1 제2 제3(사채)으로 급이 나뉘고..
냉전 시절에 세계 나라들이 제1(자유진영), 제2(공산권), 제3(나머지 신흥 독립/중립국)으로 나뉘었다.

그런 것처럼 좀 뜬금없지만 세계 문자들을 얼추 3개 그룹으로 나눌 수 있겠다.

1.
제1군은 형태가 제일 단순한 풀어쓰기 음소문자들이다. 서양의 라틴 알파벳, 러시아 키릴, 그리스 문자 따위.
기계화하기에 제일 유리하다. 기계식 수동 타자기는 말할 것도 없고, 컴퓨터 기준으로도 1980년대 8비트 PC의 메모리와 속도, 디스플레이 해상도로도 모두 거뜬히 구현 가능했다. 극악의 저해상도 8*8 픽셀 블록으로도 표현 가능할 정도니까.

한글 풀어쓰기라든가 반각 가타카나는 더 복잡한 자국 문자를 최소한으로 변형해서 제1군처럼 처리하려 노력했던 흔적이다.
세벌식 쌍초점 타자기(+ 직결식 폰트)는.. 한글을 외형상 모아쓰기를 유지하면서 제1군처럼 처리하는 굉장히 획기적인 방법론을 구현했다.

2.
다음으로 제2군은 동아시아 한중일의 소위 '2바이트 문자'에 속하는 한글, 가나, 한자 같은 문자들이다.
제1군 문자보다 훨씬 더 뚱뚱해서 전/반각 구분이 필요하고, 실용적인 수준의 문자 집합 크기도 수천 자에 달한다. 문자의 크기 대비 디스플레이 해상도, 컴의 메모리와 속도, 입출력 오버헤드 등을 감안했을 때 8비트 컴으로는 감당이 안 되고 최소 '16비트' 정도는 필요하다. 입력을 위해 IME라는 소프트웨어 계층이 필요하다.

내 한글 입력기는 이런 고민 과정에서 개발이 시작됐다.
우리나라 자국 문자는 1군이 아니라 2군에 속하는데? 대문자나 바리에이션 문자가 없는 대신에 모아쓰기가 특징인데?
그렇다면 이 특성을 그저 "부담, 오버헤드, 짐, 단점이 아니라 개성과 특징, 장점으로 살릴 수 없을까..?"

컴퓨터라는 기계가 존재하고 한글이라는 문자가 존재한다면 그 사이에서 생각할 수 있는 미친짓은 다 할 수 있는 소프트웨어 기반을 만들었다. 최소한, 아이디어가 있는데 그걸 구현할 수 있는 프로그램이 없어서 못 쓴다는 말은 안 나오게 말이다.

왜 일본에서 무슨 영상물이나 물건 만든 걸 보면.. 장인정신에 창의적인 걸 넘어서 혀를 내두를 정도로 '쓸데없이 고퀄리티'스러운 게 많다.
"걔네들이 자국 문자가 한글이었다면 그 정신머리 근성으로 이런 입력기 정도 만들었을 것이다~~" 난 이걸 염두에 두고 프로그램을 만들었다. 근데 그런 짓을 현실의 일본인이 하지는 않을 테니까 한국인이 해야지.

(내 프로그램에서 제공하는 한글 입력 예제 중에는 일본인이 고안한 것도 하나 수록돼 있다. ㄱ+ㅏ+ㅏ로 '까'를 만드는 특이한 방식...)

  • 그런 기술 기반 위에서 공평하게 오덕질을 하다 보면 “세벌식이 잉여질 오덕질할 게 더 많고 활용 범위도 더 넓다는 게 입증된다. 초성 종성 구분하고 동기화할 골머리 대신, 초성 종성 병렬화가 가능하다~
  • 타자기에서 컴퓨터에서 바뀌었다고 두벌 세벌 차이가 없는 게 아니다.. 이것도 입증된다.
  • 기왕 1군이 아니라 2군에서 판을 짤 거면 이렇게 놀아야 문자 차원의 경쟁력이 선다..

이게 20년 전이나 지금이나 변함없는 내 지론이다. ^^

3.
그리고 끝으로 제3군은 뭐.. 제1군은 물론이고 제2군보다도 더 복잡한 로직이 동반돼야 입출력 가능한 문자이다. 이른바 complex script.
아무래도 8비트, 16비트를 넘어 32비트 이후의 컴터 시대가 돼서야 제대로 표현 가능해졌다.

  • 문자의 정보량이랑, 화면에 보이는 글자 수· 길이 사이에 개연성이 전혀 없다던가. -_-;;
  • 같은 문자가 앞뒤 글자가 무엇이냐에 따라서 형태가 막 달라진다던가..
  • 글자를 하나 찍고 끝이 아니라 뭐가 덕지덕지 바리에이션이 많다던가..
  • 유니코드의 등장 이전엔 애초에 코드값이 부여조차 되지 않았던가..

아랍, 태국, 베트남 문자가 이런 3군까지 간다. 텍스트 에디터를 만들어서 블록이나 cursor 이동을 구현하는 것도 훨씬 더 어렵다.
아까 제2군은 각각의 글자가 복잡하고 무거워서 1군보다 처리하기 까다로웠을 뿐, 3군 같은 형태의 난해함· 복잡함은 없다는 걸 생각해 보자.

라틴 알파벳은 아주 특이하게 날려 쓴 필기체를 구현할 때에 폰트에 한해서나 이런 기술이 필요하다.
한글은 옛한글까지 생각하자면 일부 기술이 3군까지 내려간다.

한글 기계화 카테고리에 거의 5년 만에 새 글이구나.. ㅡ,.ㅡ;;
자고로 문자는 그림보다는 숫자에 더 가까운 형태로 만드는 게 처리하기 더 용이할 것이다. 암호학을 생각해 보시길.. 문자를 숫자처럼 취급하지 않으면 정보이론이라든가 암호학이란 게 존재할 수 없다.

Posted by 사무엘

2024/04/17 08:35 2024/04/17 08:35
,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/2287

1. 단모음 A와 O

라틴 알파벳에서 A와 O는 통상적으로 ㅏ, ㅗ 음가에 대응하는 것으로 여겨진다. 독일도 그렇고, 또 영어의 종주국인 영국도 그런 편이다.
하지만 영어를 사용하는 실질적인 최대강국인 미국에서는 이들 발음이 변해 버려서 비영어권 국가에서 외래어의 표기에 많은 혼란을 주고 있다.

걔네들은 ㅏ, ㅗ이던 것이 ㅐ, ㅏ로 변해 버렸다. 그러고 보니 U도 ㅜ냐 ㅓ냐 갖고 굉장히 오락가락하네.. 모음삼각도로 표현하자면, 다들 시계 방향으로 살짝 회전해 버린 것 같다. 안 변한 건 I(ㅣ)와 E(ㅔ)뿐이다.

그래서 톰이냐 탐이냐.. 도트냐 닷이냐도 헷갈리고, 할로윈이냐 핼러윈이냐도 헷갈린다. shop도 쇼핑, 워크샵/워크숍, 포토샵 등이 매우 혼란스럽다.
일본에서는 단모음 A는 일편단심으로 ㅏ로만 적고 있다. 그래서 패밀리는 그냥 파미리이고, 애니메이션도 아니메이다. 그러니 쟤들은 ㅏ와 ㅐ가 구분이 잘 안되겠지만 우리말에서는 A와 E, 즉 ㅐ와 ㅔ가 구분이 안 돼서 문제이다.
우리나라는 미국 스타일로 음차하려는 경향이 있지만, 일본은 서양 문물을 받아들인 시기가 굉장히 일러서 그런지 영국· 독일의 보수적인 스타일을 여전히 고수하는 것 같다.

그래서 '아이패드'(pad)는 일본어로 '아이팟또 アイパット'인데.. '아이팟'(pod)은 '아이포또 アイポ-ト'라고 한다.
A와 O의 발음 괴리의 직격타를 제대로 맞았다. ㄲㄲㄲㄲ

영어의 이런 발음 변화는 영어 자신의 관점에서도 별로 좋은 현상이 아니다. 스펠링과 발음이 심하게 따로 노는 언어가 돼 버렸기 때문이다. 하지만 그것만 빼면 영어 정도면 다른 언어들에 비해 문법이 단순하고 배우기 쉬운 축에 드는 것 같다.
영어 정도의 과거형 불규칙이나 복수형 불규칙 난이도가.. 설마 한국어의 미친 높임법과 호칭, 용언 불규칙 활용 난이도에 비하겠는가? =_= 라틴어나 러시아어, 독일어의 미친 굴절에 비할 수준이겠는가? 그럴 리가 없기 때문이다.

우리말은 한때는 ㅏ와 ㅓ가 다른 것만큼이나 ㅐ와 ㅔ가 달랐던 적이 있긴 한 것 같은데 말이다.. 근데 어쩌다 '내'와 '네' 1인칭과 2인칭 대명사가 구분되지 않는 난장판이 돼 버렸을까?
이건 심각한 문제이다. 그러니 '네'가 현실에서는 '너'나 '니'로 불안하게 자꾸 바뀌는 것이다. 한국어를 공부하는 외국인 학습자의 입장에서도 아주 보기 좋지 않다.
아울러, '날다'의 활용형이 '나는'이 돼 버려서 I am과 겹치는 것도 영 보기 좋지 않다. '날으는'을 무작정 비표준으로 치부하고 금지하기가 곤란한 노릇이다.

2. 한자어처럼 생긴 외래어

바지 선(barge), 바자 회(bazaar), 마지노 선(프랑스의 지명 Maginot), 지로 용지(giro), 모기지 론(mortgage loan), 비박(Biwak)...;;

이런 것들은 한자어가 전혀 아니다. 특히 모기지 론은 '론'조차도 論이 절대 아니고 loan일 뿐이다. 마지노 선이 마지+노선(路線)이 아니듯이 말이다.
'비박'의 경우는 무려 독일어 일반명사이고, 사실은 우리말로도 '비바크'라고 표기해야 맞다. 숙박 泊하고는 전혀 관계 없다.

이래서 옛날에는 사람들이 표기를 더 꼼꼼하게 하려 애썼던 것 같다. 국한문 혼용은 말할 것도 없고, 인명 지명 같은 고유명사나 심지어 외래어는 폰트(서체)를 달리해서 표기해 놨다.
한글에다가 한자의 획 모양을 접목해서 날카로운 느낌을 주는 '순명조'라는 서체 말이다. 이게 옛날 동화책이나 교과서에서는 외래어를 표기하는 서체였다.

난 한자 혼용까지는 너무 오바이다만, 그 대신 개인적으로는 성 이름을 띄어 쓰는 것, 그리고 외래어 고유명사 뒤에 붙는 명사는 띄어 쓰는 것에 지지 소신이다. 이것까지 안 하면 구분이 너무 안 되는 것 같다.
태산, 백두산, 일본어, 평화선
에베레스트 산, 나일 강, 후지 산, 산스크리트 어, 마지노 선

3. 표기 수단

일본어는 변별 가능한 음운이 부족해서 그런지, 장단(긴/짧은)이라도 한국어보다 훨씬 더 엄격하게 구분하려는 것 같다. 그래서 대놓고 길쭉한 가로줄이 장음 부호로 쓰인다. 같은 소리라도 이게 있느냐 없느냐에 따라 의미가 완전히 달라진다.

서양의 알파벳 기반 정서법에서는 짤막한 가로줄(하이픈)이 (1) 정도가 좀 약한 띄어쓰기, (2) 긴 단어를 앞뒤 줄에 걸쳐서 열거하는 용도로 쓰이니 이와 좋은 대조를 이루는 것 같다.
그러고 보니 서양 정서법에서는 일본어의 장음 부호 같은 긴 가로줄은.. 음운 계층에서의 장음이 아니라 우리 식으로 치면 ‘줄표’.. 문장 단위에서 뜸을 들이는 걸 나타낸다. 음운 계층에서의 장음은 그냥 글자를 aa ee ei 늘어놓는 식으로 해결하니 말이다.

문자에 대해 더 생각해 보자면.. 라틴 알파벳은 대소문자 구분이 있어서 문자 용도에서 수직적인 상하 계층을 만든다. 고유명사나 이니셜을 대문자로 쓴다.
일본어는 히라가나-가타카나 구분이 있어서 수평적인 역할 구분을 형성한다. 잘 알다시피 외래어나 의성어가 가타카나로 표기된다. 알파벳으로 치면 이탤릭에 얼추 대응할 듯?

한글은 글자 차원에서는 초중종성을 모아서 스스로 굉장히 잘 완성된 형태를 형성한다. 한국어 역시 일본어보다는 음운이 풍부하고 또 복잡한 훈독이 없으니, 자국 모아쓰기 표음문자만 닥치고 늘어놓는 ‘전용’을 하는 방향으로 정서법이 깔끔하게 정착했다.

그게 대체로 좋긴 하지만, 그래도 장단을 표기에 너무 반영을 안 하다 보니 길고 짧음의 구분이 한국어에서 통째로 소멸하는 것 같아 아쉽다. 그런데 한글은 그 상태로 완성도가 너무 높기 때문에-_- 추가적인 계층을 만들 여지도 별로 없는 것 같다. 그 이상 글자의 형태를 구분하는 건 폰트의 영역으로 가야 할 듯..

필요한 경우, (1) 장음/단음이나 (2) 사이소리 정도는 기호 차원에서 표현할 방법이 꼭 있어야 할 것 같다. 이건 음운 차원이고..
더 욕심을 내자면 평소에는 붙이지만 필요에 따라 체언-조사 내지 용언-어미를 구분하는 마크, 이 명칭이 외래어나 고유명사임을 나타내는 마크, 이 어절이 체언인지 용언인지를 나타내는 마크 같은 것도 좀 있었으면 좋겠다. 가운뎃점은 일본에서 유래된 건지 모르겠다만.. 콤마보다 더 크거나(세미콜론) 작은(가운뎃점) 보조 구분자도 반드시 필요해 보인다..

4. 나머지

(1) 영어권에서는 글자를 읽을 때 같은 글자가 연속해서 나올 때 double/triple로 더 즐겨 대체하는 성향이 있다.
C++ C double plus / 007 double O seven / www triple W
우리말 "씨뿔뿔, 공공칠, 더블류더블류더블류"와 비교해 보자. =_=;;

(2) 베트남 - 비엣남, 베토벤 - 베트호픈, 맥아더 - 매카서..
뭔가 대놓고 독일식 같지는 않은데 실제 발음과 미묘하게 동떨어진 외래어 표기가 좀 있는 것 같다.
한국어와 영어의 음절 구분 방식이 다른 것도 있고, 옛날에는 실제 발음보다는 스펠링 형태를 더 고려해서 한글 표기를 정했던 것도 있다.
하지만 이미 굳어지고 정착해 버린 건 어쩔 수 없다 치는데.. 하루아침에 터키 대신 튀르키예는 너무 뜬금없고 좀 문화 충격까지 느껴졌다. =_=;; 스페인 - 에스파냐도 아니고 이건 뭐..

(3) 메시지 - 마사지 - 소시지~~ 음운 형태가 비슷한 단어들이다.
'메세지'라고 쓰고 싶다면 소시지도 소세지가 돼야 맞으며, '맛사지'라고 쓰고 싶으면 메시지도 멧시지가 돼야 할 것이다. 이런 식으로 서로 표기 방식을 보완하면 된다.
디저트 - 데저트(사막)-_-도 영어 스펠링과 발음이 헷갈리기 좋은 듯.. ㄲㄲㄲ

Posted by 사무엘

2023/10/12 19:46 2023/10/12 19:46
, , , , ,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/2218

오랜만에 문자, 글꼴 쪽의 생각을 하나 올리게 됐다.
머신러닝 라이브러리로 유명한 Google의 TensorFlow는.. 자신이 하는 일의 본질(수많은 숫자들 묶음의 흐름!)을 함축적으로 잘 표현함과 동시에 아이콘/로고도 기하학적으로 꽤 기발하게 만든 것 같다.

T와 F를 3차원 공간에서 합성한 입체도형을 형상화했는데, 이걸 한 면에서 정사영 projection을 하면 T자만 보이고, 다른 면에서 그렇게 하면 F자만 보이기 때문이다. true/false 같은 느낌이 난다만.. 뭐 그 심상도 논리학이 연상되니 나쁘지 않다.

사용자 삽입 이미지

같지는 않지만 비슷한 예로 Excel의 아이콘이 떠오른다.

얘는 마치 ICQ, NME(enemy)처럼.. 알파벳 XL만 늘어놓고 그대로 읽어도 같은 발음이 나오는 단어이다. 그렇기 때문에 아이콘도 대놓고 그 글자를 겹쳐 놓은 모양으로 만들어졌다.
단, L은 X의 획에 맞춰서 세로획을 기울였다는 것이 포인트이다. 그래서 X와 달리 바닥에 눕힌 듯한 입체 효과가 미묘하게 난다.

이렇게 평면에다가 단순히 두께나 그림자만 입혀서 3D 효과를 낸 것 말고, 글자나 획의 배치 자체를 입체적으로 해서 기발한 시각 효과를 내는 예를 개인적으로 더 찾아보고 싶다. 아, 그러고 보니 옛날에 Quake 3 Arena도 있다. Q자를 반쯤 테 모양으로 잘 형상화했다.

사용자 삽입 이미지

한편 한글은.. 당장 자음 모음을 각각 서로 다른 축의 평면에다가 대응시킨 것을 표현한 실험적인 탈네모 글꼴이 있다.

사용자 삽입 이미지

Posted by 사무엘

2020/02/08 19:37 2020/02/08 19:37
,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/1713

유니코드 1.x가 제정되었을 때는 믿거나 말거나 한글도 글자마디는 완성형 몇천 자만 지금과는 딴판의 영역에 등록되어 있었다. 단, 글자마디뿐만 아니라 옛한글을 포함한 자모도 자음 134개(물론 초성과 종성의 개수는 서로 다르고 따로 등록됨), 모음 66개가 등록되어서 이 자모들을 아래아한글 2.x가 한컴 2바이트 코드에서 그대로 채택해서 썼다. 한컴 2바이트 코드는 기존 조합형 코드와 유니코드를 적당히 짬뽕한 문자 코드였던 것이다.

유니코드는 첫 도입 배경이 저렇다 보니 “유니코드 = all 2바이트 단일 문자 체계 = wide character 문자 체계”라고 혼동하는 사람이 적지 않다. 그러나 이는 개념적으로 올바른 관계가 아니다. 2바이트 문자 체계로만 치자면 한컴 2바이트 코드도 이에 해당하며, 윈도 이외에 유닉스 계열 OS에서는 wide character는 16비트가 아니라 32비트인 경우도 있다. 왜 32비트이냐 하면 6만 5천여 개라는 집합 크기도 시간이 흐르다 보니 부족해졌기 때문이다.

1996년에 유니코드 2.0이 제정되면서 유니코드는 오늘날 우리가 아는 유니코드와 같은 뼈대가 갖춰졌다. 한번 등록한 문자는 이제부터 재배치나 제거 없이 영구불변으로 굳히기로 했으며, 이때 현대 한글 글자마디 11172자가 순서대로 고스란히 등록되었다. 2바이트 조합형처럼 비트 연산은 못 쓰지만 그래도 테이블 없이 뺄셈과 나눗셈, 나머지 연산으로 한글의 자소 정보를 얻을 수 있으니, 과거 조합형 한글 코드의 장점을 유니코드에서도 물려받은 셈이다.

외국 위원들의 반대를 무릅쓰고 한글에다 유니코드의 금싸라기 영역을 이만치 할당 받기 위해 한국 위원회 사람들이 애를 많이 썼다. 사실 확장완성형도 유니코드 등록 근거를 대기 위해 급히 만들어진 것이라고 한다.
이와 더불어 유니코드 2.0에서는 중요한 개념 내지 꼼수가 추가로 도입되었는데, 바로 surrogate이다.
16비트 공간 중 일부 영역은 그대로 쓰지 말고 따로 떼어 내서 두 글자를 뭉쳐서 더 많은 종류의 글자를 표현하는 데 쓰자는 것이다.

0xD800부터 0xDBFF는 high surrogat이고, 0xDC00부터 0xDFFF까지는 low surrogate이다. high는 언제나 앞에, low는 언제나 뒤에 오는 식으로 역할이 딱 고정되어 있다. 1024개의 앞짝과 1024개의 뒷짝이 만나니, 총 2048개의 독립 글자를 희생하여 2의 20승, 약 100만여 개의 글자 공간을 추가로 확보할 수 있게 된다. 요컨대 유니코드에 U+D800 같은 글자는 없고, U+D7FF 다음에는 곧바로 U+E000이 이어진다. 그 대신 0xD800과 0xDC00이 만나면 U+10000이라는 surrogate, 즉 확장 평면이 시작될 뿐이다. 예전의 16비트 단일 영역은 '기본 다국어 평면'(BMP)이라고 불리게 되었다.

비록 과거의 1바이트/2바이트 혼합 체계보다는 사정이 훨씬 낫고 문자열 처리가 수월한 건 사실이지만, 어쨌든 유니코드도 확장으로 인해 2바이트 단일 표현(UCS2)이라는 깔끔한 장점은 포기해야 하게 되었다. 이쯤 되니 유니코드라는 개념에서 문자 코드와 인코딩을 구분해서 표현해야 할 필요가 생겼다.

유니코드 자체는 UCS, 즉 universal character set이라 불리는 단일 문자 집합이다. 얘는 '가'라는 한글 글자에다가 U+AC00이라는 코드값을 부여해 줄 뿐, 그 코드값이 메모리나 파일에 어떻게 표현되는지에 대해서는 규정하지 않는다. 이를 표현하는 방식이 바로 Unicode transfer format, 즉 인코딩이 된다.

모든 유니코드 번호를 아무 뒤끝 없이 32비트 정수 하나로 균일하게 표현하면 그것은 UTF32이다. 아까 wide character가 4바이트인 플랫폼은 바로 UTF32를 구현하는 자료형인 것이다. 가장 깔끔하고 공간도 넉넉하고 모든 글자를 하나씩 쉽게 접근할 수 있지만 한 글자가 4바이트나 차지하여 메모리 낭비가 심하다.

BMP 영역에 있는 놈은 종전대로 16비트 정수 하나로 표현하고 확장 평면에 있는 놈만 surrogate 두 개로 쪼개서 표현하는 방식은 UTF16이라고 불린다. UCS2를 개념적으로 확장한 것이기 때문에 처음부터 2바이트 wide character를 표방하며 개발된 Windows 플랫폼이 매우 사랑하는 방식이다. 비록 Windows의 wchar_t는 이제 유니코드 코드 포인트 하나를 온전히 표현할 수 있을 정도로 충분히 크지 못한데도 말이다.

끝으로, 그 이름도 유명한 UTF8이 있다. 얘는 U+007F 안에 드는 전통적인 알파벳· 숫자, 제어 문자들은 1바이트로 유지하고, 나머지 BMP 영역의 외국어들은 2~3바이트로 표현하고 surrogate는 BMP와 동일한 4바이트로 늘여 표현하는 진정한 multibyte 인코딩이다.

n째 문자를 찾는 무작위 접근은 안 되겠지만, Windows NT처럼 커널을 처음부터 16비트 문자 단위로 설계하지 않고도 기존 8비트 문자 시스템에서 유니코드를 단절감 없이 표현할 수 있다는 엄청난 장점이 있다. CPU의 엔디언(비트 배열 순서)의 영향을 받지 않으며, tail byte가 기존 영문· 숫자와 충돌을 일으키지도 않는다는 점도 좋고 말이다.
그래서 얘는 웹에서 매우 사랑받고 있고 윈도 이외의 플랫폼에서는 파일뿐만 아니라 메모리 저장용으로도 UTF8이 즐겨 쓰인다. 사실 윈도만 이례적으로 UTF16을 너무 사랑하고 있는 것이고.. ㅎㅎ

여담이지만 UTF32, 16, 8 중 유니코드의 문자 집합이 먼 미래에 또 확장되어야 할 때, 공간이 가장 넉넉하게 남아 있는 놈은 두 말할 나위 없이 UTF32이다. UTF8이야 애초부터 들쭉날쭉 가변 길이 인코딩을 표방했기 때문에 한 글자당 4바이트보다 더 긴 5~6바이트까지 약간 더 확장할 여지가 있다. 지금 당장은 그것까지는 쓰이지 않지만 말이다.

하지만 UTF16은 유일하게 확장의 여지가 전혀 없다. 지금 surrogate 영역이 다 차 버리면 surrogate의 surrogate라도 또 만들지 않는 이상 답이 없다. 그리고 그런 헛짓을 할 바에야 차라리 UTF16을 폐기하고 UTF8 아니면 UTF32로 갈아타는 게 낫지..;; 이런 미묘한 면모가 있다.

다만, 한글 표현의 관점에서는 메모리가 가장 적게 드는 인코딩이 UTF16이라는 것도 감안할 점이다. 현대 한글 글자마디의 경우 UTF8은 3바이트, UTF32는 4바이트이지만 UTF16은 2바이트다. 초-중-종성이 모두 갖춰진 옛한글이라면 UTF8과 UTF32는 각각 9바이트, 12바이트를 차지하지만 UTF16은 6바이트이니 차이가 더 벌어지게 된다. 유니코드에는 한글이 완성형(글자마디+호환용 자모) 방식과 조합형(세벌 한글 자모) 방식이 모두 등록되었으며 완성형 방식도 11172자가 순서대로 모두 등록되었으니, 예전의 조합형· 완성형 논쟁을 완전히 종결짓는 데 성공했다.

Windows NT도 처음에 개발될 때 문자 처리 단위를 wide로 무리해서 넓히느라 고생하지 말고, 그냥 UTF8만 도입했으면 어땠을까 싶지만 이제 와서는 다 지난 일이다. 아무래도 UTF8보다야 UTF16이 컴퓨터의 입장에서는 더 빠르고 간편하게 각각의 문자를 인식할 수 있으며, 이것이 메모리와 성능 소모면에서 UTF32와 UTF8 사이의 완충지대 역할을 해 온 건 부인할 수 없기 때문이다. 덕분에 Windows API의 관점에서는 UTF8조차도 native 인코딩인 유니코드 UTF16으로부터 '변환'되어야 하는 여러 multibyte 인코딩 중의 하나일 뿐이다~! ㅎㅎ

옛날에 인터넷 익스플로러의 버전이 5~6이던 시절엔 한글로 된 URL이 인식이 잘 안 돼서 맨날 “URL을 UTF8로 보냄” 옵션을 끄라는 지시가 팁처럼 공유되곤 했다. 당시엔 Unicode-aware하지 않은 웹 서버가 아직 많아서 말이다. 오늘날로 치면 UAC(사용자 계정 컨트롤)를 끄거나 팝업 창 허용 기능을 사용하는 것과 비슷한 편법이다.
하지만 요즘은 UTF8 방식 URL이 표준으로 정착한 지 오래다. 호환성을 중요시하는 IE에나 그런 옵션이 있지, 크롬 같은 브라우저는 선택의 여지 없이 무조건 UTF8이기도 하고 말이다.

유니코드는 문자 처리 기술의 발전과 함께 더욱 덩치가 커졌으며, 한편으로 더욱 복잡해지고 지저분해지고 있다.
UTF32가 아닌 인코딩으로는 어차피 메모리 배열 인덱스만으로 실제 글자 인덱스를 얻을 수 없는 것은 물론이거니와, 메모리 상으로 존재하는 글자 코드 포인트 수와, 화면에 출력되는 글자의 수도 일대일 대응이 전혀 이뤄지지 않게 되었다. 옛한글이라는 것도 유니코드 관련 기술이 방대해지면서 덤으로 같이 처리 가능해졌을 뿐이다. 진짜 미치도록 복잡한 문자에 비하면 옛한글 쯤이야 양반이지... 동일한 글자를 나타내는 방법이 여러 가지 존재하게 되어서 정규화라는 것도 필요해졌다.

코드 포인트 값만으로 정렬을 하는 것 역시 상당수 의미를 잃었다. 옛한글 자모는 유니코드 5.2 때 한양 PUA 비표준에만 존재하던 것들이 추가 등록되었는데, 이것들의 코드 포인트상의 순서를 따지는 건 부질없는 짓이다. 가뜩이나 부족한 BMP 공간의 여러 틈새에 산발적으로 간신히 등록된 것 자체를 감지덕지해야 할 판이다.

한자는 더욱 가관이다. 유니코드에서 공간을 압도적으로 제일 많이 차지하고 있는 문자인 건 두 말할 나위도 없거니와.. BMP 영역에 이미 등록돼 있고 호환용 같은 이유도 없는데 작업자의 실수로 인해 나중에 surrogate 확장 평면에 중복 등록된 글자도 있고, 일본 문자 코드의 실수 때문에 문헌에 전혀 등장한 적이 없는 유령 한자가 등재돼 있기도 하다.

이것이 오늘날의 컴퓨터 문명을 지배하고 있는 가장 원초적인 규범에 속하는 유니코드의 현실이다. ㅎㅎ
수십 년 주기로 유니코드를 전면 reset하고 코드값을 재정리하면 어떨까 싶지만 그건 기존 컴퓨터 문명이 핵 전쟁 같은 걸로 폭삭 없어지지 않는 한, 상상 속에서나 가능한 일일 것이다.

Posted by 사무엘

2013/12/16 08:25 2013/12/16 08:25
, , , , ,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/909

디지털 컴퓨터는 전자 신호로 0과 1만을 인식할 수 있다. 그렇기 때문에 컴퓨터에서는 문자 역시 0과 1의 조합인 숫자로 표현되며, 문자를 그런 숫자에다가 대응시키는 규칙이 바로 문자 코드이다. 정보 교환을 원활히 하기 위해서는 보내는 쪽과 받는 쪽이 모두 문자 코드가 통일돼 있어야 함은 두 말할 나위가 없다.

정보량의 최소 단위는 1비트이지만 현실적으로 컴퓨터의 기억 장치들이 한 글자로 취급하는 정보량의 최소 단위는 8비트, 즉 바이트이다. 8비트, 2^8승, 즉 256이라는 정보량은 숫자와 알파벳을 정하는 데는 충분하고 상위 1비트를 잉여화하여 오류 검출용으로까지 사용할 수 있을 정도이지만, 한글이나 한자 같은 문자를 담는 데는 턱없이 부족하다.

한자는 글자를 체계적으로 부분글자로 분해할 뾰족할 방도가 없는 상태로 글자 수가 너무 많다. 한글은 글자 생성 체계는 한자보다 훨씬 더 유리한 위치에 있지만, 실용적으로 편하게 다루려면 여전히 1만여 개의 미리 조합된 음절 형태를 그대로 배당해야 한다.

예를 들어 현실에서 '학교'라는 단어는 두 글자로 간주되지, 데이터베이스나 문서 분량 같은 데서 5글자라고 계수되는 곳은 아무도 없다. 코드 차지 영역을 줄이자니 메모리 사용량이 늘며, 그리고 오늘날로 치면 화면에 보이는 글자 길이와 메모리를 차지하는 글자 길이가 서로 완전히 따로 노는 complex script 급의 복잡한 기술이 필요해진다.

결국 한글과 한자는 1바이트만으로 표현할 수 없고 통상 2바이트로 표현된다. 그런데 기존 1바이트 영문· 숫자를 건드릴 수는 없으니 1바이트와 2바이트 문자가 공존하는 multi-byte 코드 체계가 만들어진다. 영문권에서 패리티 비트 내지 유럽 특수문자를 표현하는 데 쓰이는 최상위 1비트는, 이 문자가 1바이트로 끝인지 아니면 2바이트 문자의 첫 바이트(lead byte)인지를 판별하는 비트로 쓰인다.
공교롭게도 한글· 한자는 폭도 균일한 2글자 분량을 차지하여 비주얼 상 잘 어울린다. 전각· 반각이라는 개념이 여기서 유래된다.

그런데 lead byte는 그렇다 쳐도 2바이트의 다음 둘째 바이트인 tail byte도 기존 순수 1바이트 문자들과(영문· 숫자 같은) 전혀 겹치지 않게 할 것인지? 아니면 어차피 얘는 lead byte에 의해 변별이 됐으니 좀 문맥 의존적으로 겹치는 걸 허용할 것인지가 문제가 된다. 한글 코드의 경우 완성형은 겹치지 않으나 조합형은 겹친다.

그렇기 때문에 조합형은 tail byte가 대문자 알파벳과 소뭇자 알파벳이 제각기 따로 될 수 있고 심지어 \ 역슬래시 문자가 나올 수도 있다. 이런 이유로 인해 조합형은 1비트 + 초중성 5비트씩 한글의 구성 원리를 매우 잘 반영하여 설계된 문자 코드임에도 불구하고 당시 8.3 제약이 있던 시절에 파일 이름을 사실상 한글로 지정할 수 없었으며, 심지어 이론적으로는 // 주석을 조합형 한글로 지정한 경우 \ 때문에 2-byte aware 하지 않은 컴파일러에서는 충돌이 발생할 수도 있었다.

옛날에 한글 MS-DOS 시절에 한글 도스 셸이나 QBasic처럼 텍스트 GUI(?)를 구현한 프로그램들을 실행해 보면 한국 마소가 굉장히 잘 만든 게 있었다. 메뉴나 대화상자 같은 게 표시되어서 배경에 있던 2바이트 텍스트를 반토막 내더라도 깨진 문자열을 보여주는 법이 결코 없었다. 늘 짝수 바이트가 유지돼야 하는 한글/한자 영역이 홀수 바이트로 줄어들면 가장자리를 하나 삭제해 주면 된다.

그러나 문맥 의존적인 문자 코드로 그런 걸 구현하려면 문자열을 처음부터 읽어 봐야 하고, 두 바이트 중 하나가 소실됐을 때의 뒷처리가 문맥 독립 코드보다 더 어려우면 어렵지 쉽지는 않을 것이다. 불가능하다는 뜻은 아니지만.

조합형을 옹호하고 완성형을 까기에만 바쁜 분들의 심정이야 세벌식+한글 에반젤리스트로서 본인은 적극 이해한다. 그러나 과거의 2바이트 한글 코드의 이면엔 이런 면모도 있었음을 지적하고자 한다. 완성형은 여러 이슈가 얽혀서 그렇게 만들어졌지, 작정하고 한글을 난도질하려는 악의적인 의도로 만들어진 건 아니었다. 문맥 독립성뿐만 아니라 굉장히 보수적인 국제 규격 권장 사항을 만족하는 방식으로 문자 코드를 만들려다 보니, 한글 11172자에다 한자와 각종 특수문자들까지 넣을 절대적인 공간 자체가 부족했기 때문이다.

나중에 완성형에다 어거지로 한글 부족분을 채워 넣은 cp949 확장완성형은 어차피 조합형처럼 문맥 독립성이 깨졌다. 물론, 어차피 이렇게 만들 거면 처음부터 조합형으로 가지 하는 비판은 피할 수 없게 된 게 사실이다. 그런데, 이런 비슷한 삽질을 일본도 문자 코드를 만들면서 했으며, 이를 우리나라도 그대로 답습했을 뿐이다.

조합형과 완성형은 11172자와 2350자의 차이뿐만 아니라 한글 낱자를 표현하는 방식에서 매우 큰 차이가 있다.
조합형은 글자마디와 자모의 차이가 사실상 없다. 그냥 초 중 종성 중 한 성분만 있으면 자모이고, 초성과 중성이 갖춰졌으면 글자마디이다. 초성 ㄱ과 종성 ㄱ을 구분해서 표현할 수 있고 초성+종성이나 중성+종성 같은 '미완성 한글'도 얼마든지 표현할 수 있다.

그러나 완성형엔 그런 개념이 없다. 한글 입력을 처음 시작했을 때 쓰라고 '호환용 한글 자모'라는 게 있는데 그건 한글이 아니라 명목상으로는 '특수문자' 영역이다. 그냥 한글 자모 모양인 그림일 뿐이다. 초성+종성 구분이나 미완성 한글 표현 같은 건 없다.

메모리 1바이트가 아깝던 16비트 도스 시절에 국내에서는 조합형 한글 코드+글꼴이 쓰였지 마소의 윈도처럼 2350자 완성형 코드+글꼴로 돈지랄을 하는 프로그램은 전혀 없었다. 이런 압도적인 인지도의 차이로 인해 조합형은 1992년에 한국의 복수 표준으로 승격되어서 cp1361이라는 이름으로 나름 운영체제의 코드 페이지에 등록도 됐다.

자, 이렇게 컴퓨터는 1바이트 인코딩에다가 한중일 문화권을 위한 1+2바이트 멀티바이트 인코딩 구도가 유지되었고 마소에서는 이를 도스 시절부터 코드 페이지라고 불렀다. 그런데 이런 문자 코드들은 (1) 알파벳· 숫자 같은 공통 문자를 제외하면 같은 문자라 해도 국가마다 배당된 코드값이 같을 수가 없고, (2) 문자 집합 자체의 크기가 너무 작아서 세계 모든 문자들을 한 코드 페이지에다 담을 수 없다는 문제가 있었다.

人(사람 인)이라는 한자가 한국· 중국· 일본의 표준 코드에서의 코드값이 같을 리가 없으니 (1)은 자명한 문제다. (2)의 경우, 2바이트 코드라 해도 앞서 보았듯이 1바이트 문자와의 충돌을 피하기 위해 매우 제한된 영역의 바이트들만 묶을 수 있다. 이 때문에, 문맥 의존까지 시킨다 해도 추가로 만들 수 있는 문자는 1만여 자에 불과하다. CJK에서 쓰는 상용 한자들이나 간신히 다 집어넣을 정도이다.

그래서 1980년대 말부터 이런 발상의 전환이 이뤄졌다. “앞으로 컴퓨터의 메모리는 증가하고 소프트웨어 국제화의 중요성은 커질 테니, 글자 하나의 크기를 16비트로 쿨하게 확장하고 6만여 자의 공간에다가 전세계 언어 문자들을 집어넣고 동일 문자 동일 코드값을 실현하는 게 어떨까?”

이것이 바로 유니코드의 존재 목적 되시겠다. 컴공 전공자가 아니더라도 컴퓨터에서 '유니코드'라는 말은 한 번쯤은 다들 들어 보셨을 것이다. 이건 그야말로 컴퓨터 문자 코드계의 바벨 탑 내지 에스페란토 같은 물건이다.

마이크로소프트는 소프트웨어의 국제화에 굉장한 혜안이 있던 기업이었다. 그래서 OS/2와 결별하고 Windows NT를 첫 개발할 때, 애초부터 8비트 문자가 아니라 유니코드를 담을 수 있는 16비트 문자를 기반으로 설계했다. 심지어는 NTFS 파일 시스템까지도. 그리고는 이를 독자적으로 wide character이라고 부르기 시작했다. 어차피 8비트 문자만으로 충분하던 라틴 문화권에서는 별로 득이 되는 것도 없이 메모리 사용량만 두 배로 뻥튀기되는 대가를 감수하고라도 말이다.

Win32 API는 기존 16비트 윈도 API를 최대한 닮게 설계되었지만, 문자열을 다루는 모든 API에 A 버전과 W 버전 구분이 생겼다. 다만, 32비트 시절에 처음으로 도입된 OLE/COM 같은 기술은 처음부터 오로지 유니코드(= wide) 문자열만 취급하게 만들어졌다.

PE 방식으로 만들어진 32비트 EXE/DLL은 string 테이블, 메뉴, 대화상자 같은 리소스의 저장 포맷도 다 유니코드 방식으로 바뀌었다. 윈도 3.1에다가 Win32s를 설치하면 32비트 커널 DLL뿐만 아니라 각종 코드 페이지 변환 테이블도 설치되는 걸 볼 수 있다. 그게 바로 리소스를 변환하기 위해서이다.

윈도 NT가 3.x나 9x보다 메모리 사용량이 매우 많았던 이유 중 하나도 유니코드 때문이며, 반대로 윈도 9x가 유니코드 API를 지원하지 않았던 이유도 가정용 PC의 부족한 메모리 문제 때문이다.
이 때문에 컴파일 스위치만 바꿔서 유니코드와 기존 멀티바이트를 모두 커버할 수 있는 TCHAR, _T 같은 개념도 그때 생겼다. 두 개의 문자 포맷을 모두 지원하는 작업은 정말 엄청난 대공사였을 것 같다.

Posted by 사무엘

2013/12/13 08:24 2013/12/13 08:24
, , , , ,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/908


블로그 이미지

그런즉 이제 애호박, 단호박, 늙은호박 이 셋은 항상 있으나, 그 중에 제일은 늙은호박이니라.

- 사무엘

Archives

Authors

  1. 사무엘

Calendar

«   2024/04   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

Site Stats

Total hits:
2664030
Today:
1205
Yesterday:
1553