1. locale을 사용하는 이유
C나 C++ 프로그래밍을 처음 배울 때 각 문자를 아스키(ASCII) 코드를 표현하는 바이트로 취급했다.
그런데 아스키 문자를 사용하지 않는 언어가 있다.
따라서 프로그램을 작성할 때는 당장 전 세계 사용자를 대상으로 삼지는 않더라도 나중에 Localization(현지화)를 지원하거나 다양항 로케일(locale)을 인식하게 만들 수 있도록 디자인하는 것이 좋다.
그래서 로케일(Locale)이란?
로케일이란 사용자 인터페이스(UI)에서 사용되는 언어(ISO 639-1 codes 표준 형식), 지역 설정(ISO 3166-1 표준 형식), 출력 방식(Character Set 또는 ISO 8859-1, UTF-8 등의 인코딩 식별자) 등을 정의하는 문자열을 말한다. OS에서 로케일과 관련된 환경 변수들을 사용해 로케일 관련 설정들을 변경할 수 있으며, 설정된 로케일에 따라 프로그램이 지원하는 메시지, 시간 포맷, 통화 등의 출력이나 동작 등을 제어할 수도 있다. 로케일 설정은 특정 언어의 입출력에 영향을 줄 수도 있기 때문에 영어 이외의 언어를 사용하는 경우 적절한 값을 지정해야 한다.
2. Wide Characters란 무엇인가
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이다.
cout, cin, cerr, clog도 각각 wcout, wcin, wcerr, wclog라는 와이드 문자 버전이 있다. 사용법은 일반 버전과 같다.
std::wcout << L"I am a wide-character string literal.\n";
'언어 > C++' 카테고리의 다른 글
[C++] 연산자 오버로딩 (이항연산자의 매개변수가 하나인 이유) (0) | 2023.10.06 |
---|---|
[C++] for each문 ->참조 변수 언제 사용? (feat.깊은 복사, 얕은복사) (+ cin.fail) 예제 (0) | 2023.09.30 |
[C++] 얕은 복사, 깊은 복사 (0) | 2023.09.25 |
[C++] 1. 멤버이니셜라이저(feat. const 변수), 2. 생성자와 소멸자를 이용한 동적할당, 3. this 포인터 (0) | 2023.09.25 |
[C++] 참조자가 객체로 쓰였을 때는? (0) | 2023.09.25 |