레이블이 모아쓰기인 게시물을 표시합니다. 모든 게시물 표시
레이블이 모아쓰기인 게시물을 표시합니다. 모든 게시물 표시

2010년 9월 26일 일요일

한글 풀어쓰기→모아쓰기를 통해 얻은 지식들

by BLUEnLIVE | 2010/09/24 09:30

아이폰은 단점이 없는 완벽하고도 지고지순한 폰이 아니다. 철학이 뚜렷하고, 이에 따른 장단점이 명확히 나뉘는 폰이다. 그런데, 그런 원인...



1. 유니코드의 한글자소는 초중종성 정보가 있는 것과 없는 것이 별도로 존재

유니코드에는 (당연히) 음절 단위의 글자 외에도 한글자소가 별도로 존재한다.
그런데, 이 자소에는 초중종성의 정보가 있는 자소와 없는 자소가 별도로 존재한다.

일단, 정보가 있는 자소U+1100 부터 시작된다.
현대어→고어 순으로 할당되어 있으며, 현대어에는 ㅄ같은 문자가 초성에 할당되어있지 않았다.

초중종성 정보가 포함된 한글자소: U+1100부터 시작됨. 아래 표시된 부분은 종성 'ㄱ'


초중종성 정보가 없는 자소U+3131 부터 시작된다.
여기는 자음에 초성과 종성이 혼합되어 있으며, 이 순서는 완성형 한글의 순서와 정확히 일치한다.



2. 두 종류의 자소(U+1100, U+3131)를 완성형으로 변환시 문제 발생 가능

VC6은 기본적으로 유니코드가 아닌 완성형 코드를 지원한다.
그리고, 시스템에서 이를 유니코드로 변환할 때는 U+3131로 변환한다.
즉, 아래와 같은 코드를 실행시켰을 때...

CFileFind finder;
BOOL bOk = finder.FindFile(_T("c:\\*.txt"));
while (bOk)
{
  bOk = finder.FindNextFile();
  if (finder.IsDots() || finder.IsDirectory()) continue;
  _trename(finder.GetFilePath(), _T("c:\\말도안돼.txt"));
}

c:\ㅁㅏㄹㄷㅗㅇㅏㄴㄷㅙ.txt가 존재하더라도 한글자소가 U+1100으로 저장되어 있다면 rename되지 않는다.
왜냐하면 _trename()의 내부에서는 이런 순서로 진행되기 때문이다.

API: U+1100 → finder.GetFilePath(): 완성형 변환_trename(API): U+3131 변환

따라서, 멀쩡히 있는 파일명을 API를 통해 읽은 뒤 다른 이름으로 바꾸는 작업이 불가능할 때도 있는 것이다.
물론, 해결책은 있고, 간단하다. 컴파일러를 유니코드 모드로 설정하면 된다.


3. 유니코드 한글은 조합형으로 구성되었음

한글을 조합하는 방법에 대해 이리저리 고민했는데, 알고보니 유니코드의 한글 코드는 조합형으로 구성되어있다.
보통 조합형 한글이라는 개념은 2바이트(16비트)를 1비트(무조건 1)+5비트(초성)+5비트(중성)+5비트(종성)으로 구성하는 방식을 의미한다.


하지만, 유니코드의 한글은 이런 비트를 조합하는 방식은 아니다. (그런 테이블을 할당받을 수도 없음)
U+AC00부터 초성 19자, 중성 21자, 종성 28자를 순서대로 배치하는 것이다.


예컨데, 이라는 글자의 코드는 U+AC00 + 7(ㅂ)*21*28 + 15(ㅞ)*28 + 9(ㄺ) = U+DBC1이다.
이러한 원리를 이용해서 간단한 식만으로 한글을 조합하거나, 자소를 분리해낼 수 있는 것이다.

유니코드의 각국어 할당표를 만드는 과정에서 여러나라들의 수많은 알력이 있었다.
유니코드의 한글구성표를 만드는데 노력하시고, 박터지게 싸우신 모든 분들께 감사드린다.


덧. VC++ 6.0도 유니코드를 기본으로 사용할 수 있음

메뉴에서 Project → Settings... 선택한 뒤, C/C++ 탭에서 Preprocessor definitions:를 찾는다.
여기서 _MBCS를 찾아 _UNICODE로 바꾼다.


다음으로, Link 탭에서 Output을 선택한 뒤 Entry-point symbol:wWinMainCRTStartup으로 지정한다.


2010년 9월 24일 금요일

아이튠즈 보조 어플: 풀어쓰기로 변한 한글을 다시 모아주자!

아이폰은 단점이 없는 완벽하고도 지고지순한 폰이 아니다.
철학이 뚜렷하고, 이에 따른 장단점이 명확히 나뉘는 폰이다.

그런데, 그런 원인으로 발생하는 단점과는 무관하게 버그성 단점도 눈에 띈다.

그 중 눈에 확 띄는 건 저주의 아이튠즈 풀어쓰기 문제.

아이튠즈를 통해 응용 프로그램의 도큐먼트를 업로드하면 한글을 무참하게 풀어버린다.

인간적으로 이건 좀 너무하지 않냐!


내부적으로는 어떤 일이 벌어지는지는 모르겠지만, 이런 상황 자체가 이해가 되지 않는다. 어허허.
파일명을 몽땅 영어로만 올리면 되긴 하지만, 언제나 그렇게 할 수는 없다.

폴더를 지정하면 알아서 조합해주는 프로그램을 간단하게 만들었다.
이 프로그램의 기능은 단 하나다: 폴더를 지정하면 폴더에 저장된 풀어쓰기 한글을 몽땅 모아준다.

아래에서 다운받으면 되며,


실행 화면은 아래와 같다.


덧1. 풀어쓰기→모아쓰기 문제는 김용묵 님께 도움을 받았음
덧2. 이 프로그램은 VC6에서 유니코드를 잘 처리하지 못하는 문제 때문에 VS2008로 만들었다 VC6으로 다시 작업함
      이 문제를 찾는데 @nunadly 님과의 대화가 큰 도움이 되었음
덧3. 유니코드엔 초중종성 정보가 있는 한글자소와 없는 한글자소가 따로 있는 덕분에 약간 헤맸음
      이 내용은 별도 포스팅 예정

2008년 1월 28일 월요일

추억3. N바이트 한글

이번 이야기는 컴퓨터가 아니라 컴퓨터 내부에서 한글을 처리하는 방법입니다.

지금 대부분의 컴퓨터에서 한글을 저장하는 방식은 2바이트 한글입니다.
이런 저런 복잡한 과정을 거친 결과 Windows 2000/XP에서는 유니코드를 사용하고 있습니다.
(더 엄밀히는 내부적으로 유니코드를 쓰지만, 표면적으로는 확장완성형 코드를 사용합니다)

이런 현대적인 얘기로는 추억이 될 수 없고…



초창기 컴퓨터가 우리나라에 도입될 때 한글을 어떻게 표현할까 하는 문제에 대해서 아무런 검토가 없었습니다.
당시 우리나라에서 새로운 기술을 도입할 때 일본을 벤치마킹하는 사례가 많았는데, 일본어(카나)는 한글처럼 복잡한 구성이 없기 때문에 한글의 표현 방법에 대해서 벤치마킹 자체를 하지 않았기 때문입니다.
벤치마킹? 솔직히 표현하면 벤치마킹이 아니라 대놓고 베꼈습니다.

그러다 보니, Apple-][ 나, MSX, 또 IBM 호환기종까지 한글을 표현하는 방법은 가지가지이었습니다.
플랫폼을 막론하고, N바이트 한글은 지금의 한글 표현과 비교해 2가지 차이점을 보였습니다.
사용자 삽입 이미지

MSX 에뮬 paraMSX로 적어본 한글


  1. 1글자당 바이트수가 정의될 수 없다
    ㄱ: 1B, 가: 2B, 각: 3B, 갉: 4B, 궭: 5B

  2. 화면에 표시되는 글자의 크기가 정의될 수 없다
    ㄱ: 1배, 가: 가로 2배, 그: 세로 2배, 각:4배(가로, 세로 각 2배)
    ※ 이것은 정확히는 N바이트 한글의 한계가 아니라, 컴퓨터 환경 전반의 한계때문이었습니다.

물론, 지금의 한글 코드도 개선의 여지는 있습니다. (이 내용은 너무 많은 전문지식과 토론이 필요하니 패스~)
하지만, 이 때의 한글 환경은 지금 보기에는 환경이라고 부를 수 없을만큼 안습이었습니다.

이 말은 당시의 한글 환경을 개발하신 분들을 폄하하는 것이 아닙니다. 그만큼 환경이 척박했다는 뜻입니다.
그리고, 이 때 여러 프로그래머분들의 노력 위에 지금의 한글이 있는 것입니다.
뉴튼 : "내가 다른 이들보다 더 멀리 볼 수 있다면, 그것은 거인들어깨에 올라섰기 때문이다."
Isaac Newton : "If I have seen further it is by standing on the shoulders of Giants."

하지만, 당시의 한글에는 공통으로 사용할 수 있는 코드도 없을 뿐더러 디스플레이 환경이 너무나 척박했습니다. 순수 텍스트 화면이 기본이었기 때문입니다.

당시에 N바이트 한글을 지원하는 환경은 이런 것들이 있었습니다.


1. Call 3327 한글 : Apple-][

삼보 컴퓨터에 재직하시던 류백현 님께서 만든 환경입니다.
한글 화면으로 넘어가려면 call -3327[엔터]를 입력해야 했기 때문에 붙은 명칭입니다.

당시 Apple-][의 텍스트 화면은 40x24의 영문을 적을 수 있었는데, 영문 글꼴의 도트수가 7x8이었습니다.
그리고, 고해상도 그래픽 화면이 280x192를 사용했으므로 그래픽 화면에서 텍스트 화면과 같은 크기의 글꼴을 적을 수 있었습니다. 즉, 한글은 20x12의 출력이 가능했습니다.

Apple-][ 기종이 업무용으로도 많이 사용되던 시절이었고, 이 업무용 프로그램들은 Call 3327 환경에서 돌아가도록 개발되었습니다.

그리고, 약간의 버그가 있었는데, 버그를 해결하기 위한 한글이 월간 마이크로소프트웨어 지에 소개되었던 것 같은데, 정확하게는 기억나지 않습니다.

※ Apple-][는 당시 매일 놀러 가던 친구집에서 갖고 놀았습니다. ^^;;;


2. SPC-1000 한글 환경
사용자 삽입 이미지

S/W 방식이라 수정도 쉬웠을텐데…



카세트 테이프에 들어있는 한글 프로그램을 읽어들이면 한글 입력이 가능했습니다.
역시 40x24 영문 화면에서 20x12의 한글을 출력했습니다.

입력 자체는 별 이상이 없어보였지만, 백스페이스키를 입력하면 다음줄의 한글이 같이 깨지는 단점이 있었습니다.

약간 늦게 출시된 MSX의 한글에서는 이런 문제점이 없었습니다.


3. MSX 한글 version 2.0 : MSX1
사용자 삽입 이미지

Qnix는 역사의 뒤안길로 사라졌습니다



2바이트 조합형을 지원한 MSX2와 달리 MSX1에서는 N바이트 한글을 사용했습니다.
처음 부팅하면 풀어쓰기 모드에서 시작했습니다.
(블루앤라이브ㅂㅡㄹㄹㅜㅇㅐㄴㄹㅏㅇㅣㅂㅡ)

모아쓰기를 하려면 아주 단순한 명령어 하나만 입력하면 됐습니다.

POKE &HFCAD,1[엔터] : 정말 단순하지 않습니까? 많은 사용자가 초등학생/중학생이었는데…

Apple-][나 SPC-1000과 달리 글꼴을 쉽게 정의할 수 있었던 MSX는 한글 글꼴을 미리 정의해 텍스트 화면에 적는 방식을 썼습니다. (그리는 방식이 아니라 말이죠)

처음 출시되었던 MSX 한글 ver 1.0은 안정성에 약간의 문제가 있었는데, 이후 나온 한글 ver2.0으로 교체해주기만 하면 아주 안정적인 한글 환경을 사용할 수 있었습니다. (그러고 보니 자발적 리콜이었군요)

한글 ROM의 교체는 A/S 기사가 직접 ROM을 갖고 와서 교체해주거나 컴퓨터를 A/S 센터로 가져가서 교체하는 방식으로 이루어졌습니다.
지금보다는 PC의 크기가 훨씬 작았기 때문에 들고 가는 것이 그렇게 부담스럽지는 않았습니다.


4. 기울여 풀어쓰기 한글
사용자 삽입 이미지

얼핏 보면 모아쓰기로 보입니다… 위키에서 렌탈


김정수 교수님께서 1987년에 제안한 방식입니다.
한글을 45도 왼쪽으로 기울여서 풀어쓰면 모아쓴 것과 비슷하게 보이는 효과를 이용한 방식입니다.

글꼴을 쉽게 정의할 수 있는 MSX 용으로도 기울여 풀어쓰기 한글용 글꼴이 나왔습니다.
이후, 1.2~1.5에서도 이 글꼴을 지원했습니다.

지금의 개념 즉, 정렬이나 탐색 등의 기능을 종합적으로 고려해야 하는 환경에서의 개념이라면 한계가 많은 방식이겠지만, 표준화된 코드, 프린터 인쇄 방식의 통일 등 무엇 하나 정리된 것이 없는 당시의 환경에서는 상당히 혁신적인 아이디어였습니다.



지금은 N바이트 한글의 화면을 보기는 커녕, 구글 이미지로 검색을 해도 찾기 힘든 세상이 되었습니다.
지금까지 한글 환경을 개선하기 위해 노력하신 모든 분들께 감사드립니다.

p.s.1 MSX2의 한글은 n-바이트 한글이 아니기 때문에 적지 않았습니다.
      MSX2 내장 한글(MSX 한글 ver3.0)보다 정내권님께서 개발하신 한글 환경이 훨씬 부드럽게 동작했습니다.

p.s.2 n-바이트 코드에 따라서 뷁을 3~5바이트로 저장하는 경우도 있었습니다 ㅞ를 1~2바이트, ㄺ을 1~2바이트.

p.s.3 서영만 님께서 개발하시는 MSX 에뮬레이터 paraMSX를 이용해서 한글을 출력할 수 있었습니다.
      요즘 개발이 뜸하신 걸 보니 바쁘신 것 같습니다. 계속 업그레이드 되기를 빌어봅니다. 고맙습니다.

p.3.4 네이버 카페 8bit computer/MSX아이큐/금성패미콤/SPC-1000/1500/Apple역사에서
      SPC-1000의 에뮬레이터와 한글 환경을 볼 수 있었습니다. 정보를 주신 utena 님께 다시 한 번 감사드립니다.