# 유니코드 프로그래밍
## 문자 세트(Character Sets)
문자 세트란 하나의 문자와 그 문자에 부여된 값의 관계를 나타내는 일종의 테이블과
같은 것이다. 크게 SBCS, MBCS, DBCS, WBCS로 나누어진다.
## 비주얼 스튜디오에서 멀티바이트와 유니코드
Visual C++ 에서 문자처리는 멀티바이트와 유니코드가 있다.
- 멀티바이트(MBCS: Multi Byte Character Set): 영어는 1바이트, 그 외 문자는 2바이트로 처리한다.
- 유니코드(WBCS: Wide Byte Character Set): 모든 문자를 2바이트로 처리한다. (GCC는 4바이트)
## 멀티바이트 vs 유니코드?
멀티바이트는 SBCS와 DBCS를 묶어놓은 문자세트이다. DBCS에서 첫번째 바이트를
Leading Byte라고 하고 두 번째 바이트를 Trailing Byte라 한다. 첫 128문자는 ASCII
로 되어있으며 나중 128문자는 각 언어마다 다르게 지정되어 있다. 한국은 949, 일본은
932 등과같은 코드페이지(Code Page)를 사용한다.
이와같이 MBCS에서 문제점은 문자 처리에 해당하는 프로그램이 일일히 SBCS와 DBCS를
염두해 두고 개발해야 한다는 점이다. 또한 각 언어마다 다른 문자세트를 사용한다.
유니코드는 코드값이 일괄적으로 16비트로 할당되기 때문에 국제 표준화의 호환성을
최대한 지킨다. 유니코드도 DBCS처럼 문자값 표현에 있어 16비트를 사용하므로
65535 범위의 값을 표현할 수 있다.
또한 처음 127문자인 0x0080부터 0x00FE는 국제표준화 ISO8859-1의 순서와 동일하게
배열되어 있다.
# 멀티바이트 및 유니코드 사용
Win32나 MFC에서 스트링을 사용하다보면 `""`, `L""`, `TEXT("")`, `_T("")` 와 같은 사용을
볼수 있다. 차이점을 알아보자.
## `""`
프로젝트 속성의 문자집합이 멀티바이트일때 사용한다.
## `L""`
문자 리터럴이라고 하여 L""는 wchar_t 형식의 와이드 문자 리터럴을 의미한다.
> 참고: https://msdn.microsoft.com/ko-kr/library/dybsewaf.aspx?f=255&MSPPError=-2147217396
프로젝트 속성의 문자집합이 유니코드일 시 사용한다.
## `TEXT("")`, `_T("")`
이 두 매크로 같은 매크로이며 프로젝트 속성의 문자집합이 멀티바이트 혹은 유니코드
에 따라서 자동으로 변환해준다. Win32에서는 TEXT("")를 MFC에서는 _T("")를 사용한다.
유니코드로 개발하다가 멀티바이트로 변경해야 할 시 L"" 을 "" 이렇게 변경을 해 주어야
하지만, 이 매크로를 사용하면 알아서 변경해준다.
## `TCHAR`
이 매크로는 마찬가지로 프로젝트 문자집합에 따라 변수크기를 잡아준다. 즉,
유니코드 프로젝트에서는 wchar_t를, 멀티바이트 프로젝트에서는 char 타입으로 작동한다.
참고로 위의 `_T()`에서 T는 이 `TCHAR`을 의미한다.
# 결론
문자열 변수는 `TCHAR`, `PTCHAR`를 Win32에서는 `TEXT("")`를, MFC에서는 `_T("")`를 사용하자.
> 참고 문서
- http://x108zero.blogspot.com/2013/12/text-t-l.html
- http://sonhy1.tistory.com/109
- http://genesis8.tistory.com/49