Skip to content


Windows Character Encoding: UCS2? UTF-16?

예전에 문자집합;character-set 과 인코딩에 관해서 일련의 포스팅을 했다(#1, #2, #3). 그런데 어제부터 Windows via C/C++ 이란 책을 읽고있는데, 내가 잘못 알고 있던 부분을 발견해서 이전 포스팅에 대한 정정 포스팅.

Windows에서는 UCS-2 인코딩을 사용한다

라고 했었는데 사실이 아닙니다.

Windows는 2000과 그 이후의 버젼들에서 모두 UTF-16 기반으로 동작하며, 그 이전의 NT 커널들만 UCS-2 기반.

여튼 그런 연유로 저 둘을 다시 부연 설명하자면,

  • 둘 다 기본적으론 글자당 2bytes 를 할당하는 형태
  • UCS-2는 글자당 무조건 2bytes만 쓴다. 그보다 길게는 쓸 수 없는 고정길이 인코딩. BMP[1] 만 표현.
  • UTF-16은 그 이상[2] 을 표현할 수 있는 방법 — surrogate pair라는 것을 쓴다. 자세한 것은 다음 기회에 포스팅 거리로(…) — 을 제공한다. 그래서 한 글자의 길이가 4 bytes가 되는 경우가 존재한다.

정도다. Windows 에서는 UTF-16에 기반한 Unicode를 지원하며, SQL 서버들과는 좀 다르다. MS SQL서버는 내가 아는 범위에선 아직 UCS-2 위주로 동작한다. (정확히 아시는 분이 가르쳐주시면 좋겠다)

ps. 제목과는 좀 연관없는 얘기지만, Windows via C/C++ 에서 앍게된 사실 하나 더.

Windows Vista 이후의 OS는 완전히 UTF-16 모드로 동작하게 되었고, 소위 ANSI 함수들은 래퍼로만 남게 되었다. CreateWindowA, 처럼 끝에 A가 붙는 함수들[3] 의 경우에는 ANSI문자열(=MBCS 문자열)을 받아들이는 함수였는데, 이젠 정말로 래퍼 수준으로 전락해서 단순히 문자열 인자를 UTF-16 인코딩으로 변환해서 Windows System Call이나 API 함수를 호출하는 역할을 하게 되었다.

Windows Vista / Server 2008 성능을 원한다면 UTF-16 (=wide character API) 를 쓰라는 것.

  1. U+0000~U+FFFF 까지의 영역만 표현할 수 있다. 가장 기본적인 문자집합에 해당하며, 이런 부분만 표현하기 때문에 UCS-2는 고정길이가 가능해진다. 그리고 고정길이이기 때문에 Database 처럼 문자열 처리 속도가 아주 빨라야하는 응용에서는 꽤 널리 사용된다. []
  2. plane 0인 BMP말고 그 이상의 것(plane 1~15)들 까지 []
  3. 특히 CreateWindowW처럼 W로 끝나는 소위 Wide 함수들과 대응해서 []
이 저작물은 별도로 명시하지 않은 경우, Creative Commons Attribution-Share Alike 3.0 Unported License에 따라 이용하실 수 있습니다.

No related posts.

Posted in Computer.

Tagged with , , , .


2 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. 랜덤여신 says

    오오… 드디어 ANSI 함수가 래퍼로 추방됐군요! 이제 ANSI 함수 쓰는 프로그램은 더 이상 없으면 좋겠네요.

  2. rein says

    그래도 하위호환성을 추구하는 MS의 방침상으로는 (.Net은 안그런것같지만) 한동안은 “쓸 수” 있을 것 같습니다. 그래도 유니코드 응용들을 위한 한 걸음 더 인 것 같네요 ~_~



Some HTML is OK

혹은 트랙백 보내기 / or, reply to this post via trackback.