'유니코드'에 해당되는 글 1건

  1. 2008.02.25 유니코드 변환.
dev.log2008. 2. 25. 21:00

처음 유니코드 문자열을 만날 때 흔히 하는 오해(혹은 실수)는.. char*를 wchar_t*로 바꿀 때 그냥 캐스팅하면 되리라는 것이다. (나도 그랬다)

 

그런데, char*로 표현되는 문자열은, MBCS - multi-byte character set - 문자열이고, wchar_t*로 표현되는 문자열은 WCS - wide character set - 문자열이다. 서로 코딩 스킴이 다른 문자열이다. 단순 치환만으로는 변환할 수 없다.

MBCS문자열 - 즉, MBS는 보통 ASCII와 각 국가의 코드 페이지별 OEM코드를 사용하는데, 이 코드 페이지마다 같은 코드에 다른 문자를 넣어 두게 된다. 따라서 MBS에서 한글(코드페이지 949) '가'의 코드포인트는 0xb0a1인데, 다른 코드페이지에서는 (이를테면 일본어) 그 국가의 다른 글자를 나타낼 수 있는 코드이다. 이는 문자를 표현할 때 국가마다 서로 다른 코드를 쓰기 때문인데, 이를 통합하기 위해서 유니코드 문자열을 쓰며, C에서는 유니코드 문자열을 위해 문자마다 2바이트를 쓰는 WCS를 쓴다.

MBS 코드페이지 949에서 한글 '가'의 코드는 0xb0a1라고 했다. 그런데 WCS에서 한글 '가'의 코드포인트는 0xac00이다. 그럼 WCS에서 0xb0a1에 해당하는 글자는? 인텔머신은 리틀 엔디언을 쓰므로, OEM코드 0xb0a1은 0xa1b0로 저장되며, 이 코드는 'ꆰ'이다. MBS의 내용물을 그대로 WCS 문자열 버퍼에 '복사'하는 것으로는 문자열 변환이 안된다는 말이다. 물론, 그 내용물이 영미권의 영문 알파벳만이라면, 제대로 이루어진다. 이들은 ASCII코드이며, 유니코드 체계에서도 ASCII영역(코드포인트 0~127까지)은 크게 변화되지 않은 채로 남아있기 때문에. 하지만 다른 국가의 언어는 절대 저렇게 해서 변환이 이루어지지 않는다. 한글은 물론이고, 알파벳을 쓰는 다른 국가의 - 독일, 프랑스, 스페인, 노르웨이, 핀란드 등등 - 언어도 마찬가지다.

 

그럼 한글 "가"를 한글 L"가"로 제대로 바꾸려면? 표준 문자열 라이브러리 함수가 있다. mbstowcs, wcstombs등의 함수가 MBS-WCS사이의 문자열 변환을 해준다.

 

Posted by uhm