C++11의 UTF-8, UTF-16, UTF-32 표기법

회사 일을 하면서, 사람들에게 설명을 해 줘도 또 다시 물어 보고 또 물어 보고 하는 것 중에 하나가 '문자 인코딩'이다. 지금은 예전과는 달리 거의 유니 코드로 통일이 되었기 때문에 그나마 많은 비교 설명을 할 필요까지는 없다. 하지만, 그대신에 유니 코드를 표기하는 방법 자체에 대해서는 질문이 많은 편이다.
 
UCS-2, UCS-4, UTF-8, UTF-16, UTF-32 등에 대한 자료가 인터넷에는 널려서 이해를 한다 하더라도, IDE에서 소스를 만드기 위해 사용되는 문자 인코딩, 그 안에서 글자를 출력하기 위한 문자 인코딩, 그리고 실제 그것이 C 코드에 버퍼로 적용되었을 때의 인코딩이 각각 다를 수 있다는 것을 이해 시키기는 아주 힘들다.
 
const char* str = "가나다"
-> VC++에서, 소스는 KSC-5601의 코드로 표현될 수 있고 실제 실행 버퍼에서도 KSC-5601일 수 있다.
-> VC++에서, 소스는 UCS-2의 코드로 표현될 수 있고 실제 실행 버퍼에서는 KSC-5601일 수 있다.
-> Ubuntu vi에서, 소스는 UTF-8의 코드로 표현될 수 있고 실제 실행 버퍼에서는 UTF-8일 수 있다.
 
const wchar_t* str = L"가나다"
-> VC++에서, 소스는 KSC-5601의 코드로 표현될 수 있고 실제 실행 버퍼에서도 UCS-2일 수 있다.
-> VC++에서, 소스는 UCS-2의 코드로 표현될 수 있고 실제 실행 버퍼에서는 UCS-2일 수 있다.
-> Ubuntu vi에서, 소스는 UTF-8의 코드로 표현될 수 있고 실제 실행 버퍼에서는 UTF-32일 수 있다.
 
위의 예를 실제 하나식 돌려 보고 디버거로 버퍼 상태를 본 것은 아니지만, 하여간 위와 같은 상황이 될 수 있다는 것에 대해서 설명하는 것은 아주 힘들다. 특히 OS를 건너 뛰며 코드를 복사를 해 와서 생긴 문제를 가지고 왔을 때는, 그 상황을 설명하려면 더 힘들다.
 
그런데 C++11 표준에서는 ""와 L""로 구분하던 버퍼 문자열의 문자 인코딩 표기법이 좀 더 세분화 되었다.
 
const char* str = u8"가나다";
const char16_t* str = u"가나다";
const char32_t* str = U"가나다";
 
와 같이, 각각 UTF-8, UTF-16, UTF-32 에 대한 표기법이 구체적으로 생겨났다. 이제는 컴파일러별로 그 크기나 문자 인코딩이 다를 수 있었던 wchar_t 에서 벗어나, 좀 더 명확하게 버퍼 문자열의 문자 인코딩을 지정할 수 있는 방법이 생긴 것이다.
 

Posted by 안영기

2015/03/22 21:34 2015/03/22 21:34
Response
0 Trackbacks , 0 Comments
RSS :
http://smgal.ismine.net/tc_191/blog1/rss/response/47

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다


블로그 이미지

게임 개발을 기반으로 한, 잡다한 개발 기록 저장소

- 안영기

Notices

Archives

Authors

  1. 안영기

Recent Comments

Recent Trackbacks

Calendar

«   2015/03   »
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 31        

Site Stats

Total hits:
235082
Today:
20
Yesterday:
10