(전체가 아니라 C#과 차이가 있는 부분을 중심으로 요약 정리)

현지화

C나 C++ 프로그래밍을 배울 때 각각의 문자를 아스키(ASCII) 코드로 표현하는 바이트로 취급했다. 아스크 코드는 7비트로 구성됐으며 주로 8비트 char 타입으로 표현한다.

정말 좋은 프로그램은 전 세계적으로 사용되지만, 당장 전 세계 사용자를 대상으로 삼지 않더라도 나중에 현지와를 지원하거나 다양한 로케일을 인식할 수 있도록 디자인하는 것이 좋다.

스트링 리터럴 현지화하기

현지화에서 가장 중요한 원칙 중 하나는 소스 코드에 특정 언어로 된 스트링을 절대로 넣으면 안 된다는 것이다. 단 개발 과정에서 임시로 사용하는 디버그 스트링은 예외다.

MS는 윈도우 애플리케이션을 개발하는 환경에서는 현지화에 관련된 스트링을 STRINGTABLE이란 리소스로 따로 빼둔다. 다른 플랫폼도 이러한 장치가 마련돼 있다. 그래서 애플리케이션을 다른 언어에 맞게 변환할 때 다른 코드를 건드릴 필요 없이 이 리소스에 담긴 내용만 번역하면 된다. 그리고 이러한 번역 작업을 도와주는 도구도 많이 나와 있다.

현지화 할 수 있도록 소스 코드를 구성하려면 스트링 리터럴을 조합하는 문장으로 만들면 안된다. 설령 각 스트링을 현지화할 수 있더라도 말이다. 예컨대 다음과 같다.

cout << "Read " << n << " bytes" << endl;

문장을 이렇게 구성하면 네덜란드어처럼 어순이 전혀 다른 언어로 현지화하기 힘들다. 이 스트링을 제대로 현지화할 수 있게 구성하려면 다음과 같이 작성한다.

cout << Format(IDS_TRANSFERRED, n) << endl;

여기서 IDS_TRANSFERRED는 스트링 리소스 테이블에 담긴 항목 중 하나다.

와이드 문자

모든 언어가 한 문자를 1바이트에 담을 수 있는 것은 아니다. C++은 wchar_t라는 와이드 문자(확장 문자) 타입을 기본으로 제공한다. 한국어나 아랍어처럼 아스키 문자를 사용하지 않는 언어는 C++에서 wchar_t 타입으로 표현하면 된다.

하지만 C++ 표준은 wchar_t의 크기를 명확히 정의하지 않고 있다. 어떤 컴파일러는 16비트를 사용하는 반면 다른 컴파일러는 32비트로 처리하기도 하낟. 그래서 크로스 플랫폼을 지원하도록 코드를 작성하려면 wchar_t의 크기가 일정하다고 가정하면 위험하다.

영어권이 아닌 사용자를 대상으로 하는 프로그램을 작성한다면 처음부터 wchar_t 타입으로 작성하는 것이 좋다. 스트링이나 문자 리터럴을 wchar_t 타입으로 지정하려면 리터럴 앞에 L을 붙이면 된다. 그러면 와이드 문자 인코딩을 적용한다. 예컨대 wchar_t 타입의 값을 m이란 문자로 초기화하려면 다음과 같이 작성한다.

wchar_t myWideCharacter = L'm';

흔히 사용하는 타입이나 클래스마다 와이드 문자 버전이 존재한다. string 클래스의 와이드 문자 버전은 wstring이다. 스트림에 대해서도 w라는 접두어를 이용한 명명 규칙이 적용된다. 예컨대 와이드 문자 버전의 파일 출력 스트림으로 wofstream이 있고 입력 스트립은 wifstream이다. 또한 현지화를 지원하도록 스트링이나 스트림을 w가 붙은 버전으로 대체해서 코드를 작성하는 작업도 나름 재미가 쏠쏠하다.

cout, cin, cerr, clog도 각각 wcout, wcin, wcerr, wclog라는 와이드 문자 버전이 있다. 사용법은 일반 버전과 같다.

서구권이 아닌 문자 집합