좁은 ostream에 wchar_t
, char16_t
또는 char32_t
값을 입력하면 코드 포인트의 숫자 값이 인쇄됩니다.iostreams -`wchar_t` 또는`charXX_t` 값을 문자로 출력
#include <iostream>
using std::cout;
int main()
{
cout << 'x' << L'x' << u'x' << U'x' << '\n';
}
인쇄 x120120120
. 이는 basic_ostream
과 charT
의 특정 조합에 대해 operator<<
이 있지만 다른 문자 유형에 대한 유사 연산자가 없기 때문에 자동으로 int
으로 변환되어 인쇄됩니다. 유사하게, 비 좁은 문자열 리터럴 (L"x"
, u"x"
, U"X"
) 자동 캐릭터에게 (wstring
, u16string
, u32string
)는 심지어 컴파일되지 개체 void*
변환 포인터 값으로서 출력하고, 비 좁은한다.
그래서, 질문은 : 좁은 ostream에에 문자 오히려 코드 포인트의 숫자 값보다, 같은 을 wchar_t
, char16_t
, 또는 char32_t
값을 출력하는 가장 끔찍한 방법은 무엇입니까? ostream의 인코딩에서 해당 인코딩으로 표현할 수있는 코드 포인트를 올바르게 변환해야하며 코드 포인트를 나타낼 수 없을 때 오류를보고해야합니다. (예를 들어, u'…'
주어와 UTF-8 ostream에, 상기 3 바이트 시퀀스 0xE2을 0x80 0xA6를 스트림에 기록한다;하지만 u'â'
부여하고 KOI8-R의 ostream에이 오류가보고되어야한다.) 마찬가지로
, 좁은 ostream에서 비 좁은 C 문자열 또는 문자열 객체를 출력 인코딩으로 변환하는 방법은 무엇입니까?
ISO C++ 11에서 수행 할 수없는 경우 플랫폼 별 답변을 취할 것입니다.
은 (this question에 의해 영감을.)
, 당신도 1) 넓은 ostream에를 사용하는, 또는 2)) 잠재적 손실 변환되는 (자신을 인코딩 좁은에 와이드 문자 데이터를 변환합니다. ostream은 전환을 수행 할 수 없습니다. ['std :: wstring_convert'] (http : //en.cppreference.com/w/cpp/locale/wstring_convert) 또는 [ICONV] (https://www.gnu.org/software/libiconv/) 또는 [ICU] (http : //site.icu-project. org /). –