한동안 CJK 코덱은 잊고 살았는데, 올해 초에 엉뚱하게 코덱 관련 버그가 하나 떨어졌습니다.
X-MAC-JAPANESE 코덱이 없다고 하면서 파이썬 설치가 안 돼요
라는 현상인데.. 파이썬 3.0에서는 빌드할 때 잠깐 빼고는 유니코드 코덱 없이는 소스 읽기 조차 안 될
정도가 됐기 때문에 시스템 설정에 있는 기본 인코딩이 안 맞으면 설치도 안 되고 잘 뜨지도 않는
현상이 발생된 것 같군요. 아니 무슨 90년대 유물인 MacJapanese가 아직 디폴트인지는 이해를
못하겠지만 말이죠;;
그래서 찾아보니까 다른 오픈소스 유니코드 관련 프로그램들은 전혀 지원하고 있지 않았지만,
펄이 유독 지원하고 있길래 어쩔 수 없이 펄보다는 나아야지 하는 오기로 (;;) 코덱 작업을 했습니다.
으흐 -ㅇ-;
CJK와 관련된 것은 MacKorean MacJapanese MacChineseSimp MacChineseTrad 이렇게 4가지인데
윈도우의 cp949 cp932 cp936 cp950과 마찬가지로 각각 euc-kr shift-jis gb2312 big5를
확장한 방식입니다. 그런데 확장을 MS보다 더 기상천외한 방법으로 유니코드 스펙을 최대한 활용한 덕에
이런 매핑까지도 등장합니다.
1 |
0xA34A 0xF864+0x005B+0x0031+0x0030+0x005D # number ten in enclosing square, sans, shadowed |
2바이트짜리 글자 하나를 무려 유니코드 5글자에 매핑을 하는 데다가, JIS X 0213에서 주로 많이 써서 골탕을 먹였던 중간에 잘라먹어도 말이 되는 글자들이 등장합니다.
1 2 3 |
0x31 0x0031 # DIGIT ONE 0xA542 0x0031+0x20DE # DIGIT ONE + COMBINING ENCLOSING SQUARE 0xA341 0x0031+0x20DE+0xF87B # DIGIT ONE + COMBINING ENCLOSING SQUARE, sans, shadowed |
이런 경우에는 U+0031이 오면 0x31 한 글자, U+0031 U+20DE가 와도 0xA542 한 글자, U+0031 U+20DE U+F87B가 오면 0xA341 한 글자가 돼서 유니코드 1~3글자까지가 모두 다 2바이트가 돼버립니다.
그냥 단순 문자열에서는 별 문제가 없지만, 스트림 입출력 트랜스코딩에서는 이거 때문에 아주 미칠 지경이죠. 어흐흐;
그래서 그냥 C 코덱으로 매핑 덮어쓰기로 만들려니 너무 따분하고 이제 아무도 안 쓰는 인코딩 만들어 봐야 뭐하나 하는 생각에 예전에 생각해 뒀던, 딕셔너리 2개만 뿅 하고 던져주면 매핑 테이블을 덮어써서 새로운 코덱이 되는 방법으로 해 봤습니다. 예를 들어서
1 2 3 4 5 |
<span class="n">encode_map</span> <span class="o">=</span> <span class="p">{</span> <span class="s">u'a'</span><span class="p">:</span> <span class="s">'b'</span><span class="p">,</span> <span class="c"># replace original mapping</span> <span class="s">u'b'</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span> <span class="c"># invalidate original mapping</span> <span class="p">}</span> <span class="n">codec</span> <span class="o">=</span> <span class="n">_multibytecodec</span><span class="o">.</span><span class="n">create_extcodec</span><span class="p">(</span><span class="err">어쩌고</span> <span class="err">저쩌고</span><span class="o">..</span><span class="p">)</span> |
이렇게 해 주면 codec에 유니코드 a는 euc-kr에서 b로 인코딩해버리고, 유니코드 b는 모르니까
인코딩 안 해 준다고 에러내는 코덱이 나오게 됩니다. 이걸로 역슬래시 같이 논란이 있는 부분이나
용도에 따라서 좀 다르게 써야하는 만들어서 쓸 때 유용하지 않을까 생각해 봅니다~ -ㅇ-;
단, 이게 내부적으로 한 글자씩 조절을 하다보니 굉장히 비효율적이라 속도가 그렇게 빠르지는 않은
편이지만.. 그래도 요새 컴퓨터가 워낙 좋으니까.. ^_^;;
혹시 맥에서 파이썬 빌드가 잘 안 되셨던 분들은 패치를 받으셔서
한 번 해 보세요~ (아마도 별 문제가 없으면 파이썬 2.6과 3.0에 들어갈 수 있겠죠. 펄보다는 나아야지.. ㅎㅎ;;;;;;;;;;;)
이야아 폰트를 코드에 넣어버린건가요? 역시 대인배 애플!
감사합니다 ^^