Search

'wchar'에 해당되는 글 1건

  1. 2018.01.23 [윈도우] 멀티바이트와 유니코드(UTF-16, UTF-8) 1

이 이야기를 하기 앞서 ASCII 코드에 대해서 이야기 해보자.


0~127(0x00~0x7F) 까지 표시하도록 되어있는 코드 문자표다.


몇몇 컨트롤 문자와 표현 가능한 숫자와 문자, 특수 문자들로 구성되어 있다.




문제는 이걸로는 다른 문자(한글, 한자)들을 표기할 수 없다. 이래서 나온게 멀티바이트이다.


멀티 바이트는 말그대로 1개 이상의 바이트로 문자를 표기한다. 문제는 이걸 해석하는 방법이


문자마다 다 다르다는 것이다. 



우리 나라는 KS X 1001와 KS X 1003이 있으며 이를 기반으로 EUC-KR이 나오고


차후에 CP-949에서 확장되었다. 윈도우에서 사용할 수 있는 각 국가의 코드 페이지를


아래에 링크하였다.


https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd317756(v=vs.85).aspx





문제는 각 문자의 코드 페이지는 그야말로 자국어만 표현할 수 있다(CP-949는


일부 한자도 포함). 만약 CP-949로 웹페이지를 작성했다면, CP-949를 쓰지 않는


국가 사람이 접근했다면 화면이 다 깨져보인다. 실제로.. 과거에 많이 발생했던


문제이다. 또한 한글과 일본 글자. 한자들을 병용하기 어렵다. 이런 저런 문제가


있어 만들어진 것이.. 유니코드이다.




하나의 코드 페이지! 세상에 모든 문자! 유니버셜 코드 페이지!




흔히 말하는 UTF-8, UTF-16등이 이에 속한다. 요즘에는 거의 UTF-8으로 통일되고


있다. 하지만 그렇지 않은 시스템도 있다... 윈도우가 그중 하나이다.





윈도우에서 흔히 말하는 WCHAR 혹은 C++ 표준인 wchar_t 문자형은 UTF-16으로


표기된다. UTF-16과 UTF-8의 차이점에 대해서 이야기한다면 기본 길이가 차이가 있다.


UTF-8의 경우 1Byte안으로 표기할 수 있는 문자는 1Byte로 그이상은 2Byte, 그 이상은 3Byte


이런식으로 1바이트씩 커지면 문자를 표기한다. UTF-16의 경우에는 2Byte로 표기해보고


안되면 2Byte를 늘리는 식으로 커진다. 기억 속에 한글은 2Byte안으로 다 표현이 된다. 맞나?


어찌됐건 UTF-땡에 땡은 비트수를 의미한다. 어찌됐건 그리하여 이걸 가지고 어디다 써먹는가?





예를 들어 이런 문자열을 하나 만들었다고 치자.


char test1[] = "위";//0xC0A7


주석을 보면 알겠지만 "위"의 값은 0xC0 0xA7으로 표현된다.


이는 코드 페이지는 CP-949에서 확인할 수 있다. 기본적으로 윈도우에서 


char형으로 한글 문자열을 만들면 CP-949로 인코딩이 된다.


참고로 test1[0] = 0xC0, test1[1] = 0xA7. 이런식으로 저장이 된다.





그렇다면 WCHAR(혹은 wchar_t)로 인코딩하면 어떻게 되나???


wchar_t test2[] = L"水";//0x6C34


UTF-16으로 인코딩이 된다...


참고로 test2[0] = 0x6C34. 이런식으로 저장이 된다. 아까 이야기했듯이


UTF-16은 기본이 2Byte이다.




그럼 이런 문제는 언제 발생하는가? 흠...


예를 들어 시리얼 인터페이스(RS-232C 등등)를 이용하여 통신할 경우


ASCII 코드만으로 통신을 하던지, 영어 외의 언어의 경우에는 인코딩을 정해야하는데


주로 UTF-8을 이용한다. 참고로.. 그냥 UTF-8만으로 ASCII 값을 표현하면 똑같다.


길이도 같고, 값도 같고. 그런데 이게 특정 문자 표현으로 들어가면.. UTF-8으로 표현하면


UTF-16보다 길이가 길어지는 경우가 발생한다. 한글만 봐도 보통 UTF-8으로 하면


3Byte인데 UTF-16으로 하면 대부분 2Byte가 된다. 뭐 하고 싶으면 데이터 압축을 하던지


해서 보내면 되지만 시리얼 인터페이스란게 그런 용도가 아니다. 그외에 예를 들어


QR 바코드에 한국어를 넣고 이를 스캔을 한다고 하면 같은 내용을 표현하기 위해


더 많은 Byte가 필요하게 되어 곤란해진다...


이런 저런 이유로 아직도 CP-949나 UTF-16으로 인코딩되서 보내는 장비들이 많다.


이런 경우에 주로 신경 쓰는것 같다. 내 경우에는..


나중에 더 자세히 이해하게 되면 추가 예정!





'Programming > Tips' 카테고리의 다른 글

C#소스 -> VB.NET 소스 변경  (0) 2014.09.26
BOOL과 bool  (0) 2014.08.27