2010-06-28 4 views
6

내 코드는 기본적으로 이것이다 :C++ : 와이드 문자가 잘못 출력됩니까?

wstring japan = L"日本"; 
wstring message = L"Welcome! Japan is "; 

message += japan; 

wprintf(message.c_str()); 

나는 넓은 문자열을 사용하고자하는거야하지만 난 그들이 출력하는 방법을 모른다는, 그래서 wprintf을 사용했다. 나는 같은 것을 실행하면 :

65 57 63 6c 6d 6f 21 65 4a 20 70 61 6e 61 69 20 20 73 3f 3f 
e W c l m o ! e J  p a n a i  s ? ? 

왜 그들은 모두 순서대로 뛰어됩니다

./widestr | hexdump 

를 16 진수 코드 점은이를 만들? 나는 wprintf가 잘못되었다는 것을 의미한다. 나는 아직도 왜 그렇게 복잡한 순서로 출력 할 것인가를 알지 못한다!

편집 : endianness 또는 something? 그들은 각 두 문자를 회전하는 것처럼 보입니다. 허.

편집 2 : wcout을 사용하여 시도했지만 똑같은 16 진수 코드 포인트를 출력합니다. 기묘한!

+0

아마도'cout << message << endl'을 시도해야 할 것입니다. – phimuemue

+0

@phimuemue, 그것은 작동하지 않습니다, 그것은 대략 나를 포함하여 대략 30 개의 오류를 보내고, 처음에는 'widestr.cpp : 18 : error :'연산자 '에 대한 일치'는 'std :: cout << message'' ostream char 특성 또는 무언가, 그것은 넓은 문자열을 출력하지 않습니다! –

+1

어떤 플랫폼과 컴파일러를 사용하고 있습니까? – hlovdal

답변

11

당신은 예상대로 로케일에게

#include <stdio.h> 
    #include <string> 
    #include <locale> 
    #include <iostream> 

    using namespace std; 

    int main() 
    { 

      std::locale::global(std::locale("")); 
      wstring japan = L"日本"; 
      wstring message = L"Welcome! Japan is "; 

      message += japan; 

      wprintf(message.c_str()); 
      wcout << message << endl; 
    } 

작품을 정의해야합니다 (즉, UTF-8 축소하고 인쇄 할 수 넓은 문자열을 변환). 이 시스템 로케일을 설정 (이 UTF-8 인 경우는 UTF-8로 출력 할 것입니다 - - 변환됩니다 즉, 형식 wstring)는 ""글로벌 로케일을 정의

편집 : sync_with_stdio에 대해 내가 말한 것을 잊어 버려라. - 이것은 정확하지 않다. 그것들은 기본적으로 동기화되어있다. 필요하지 않습니다.

+1

당신은'sync_with_stdio'와'wcout'과 같은 소리를 내게됩니다. 그들은 완전히 다른 일을합니다. C 스트림 함수 ('wprintf'와 같은)를 C++ 스트림 사용 ('wcout')과 인터리빙하고 싶다면'sync_with_stdio'가 필요합니다; 'imbue'는'wcout'이 사용하는 로케일을 변경하고자 할 때 필요합니다. –

+0

테스트 할 수는 없지만 'wchar_t'는 Windows의 경우 UTF-16 코드 단위이고 UTF-16은 Windows의 유일한 인코딩이므로 'wcout'은 Windows에서 코드 페이지 설정없이 작동해야합니다. 그래서'std :: wcout'는 로케일 변환없이'WriteConsoleW'를 사용해야합니다. 그렇지 않으면 라이브러리 버그입니다. – Philipp

+2

@Philipp 이것은 표준에 의해 정의되는 방식이 아닙니다. Standard는 넓은 문자가 로켈의 코드 페이지에 따라 좁은 인코딩으로 변환되어야한다고 말합니다. 그리고 이것이 끝난 것입니다. Windows의 문제는 UTF-8을 지원하지 않는다는 것입니다. 따라서 Windows에서는'locale :: globale (locale ("Japan"))'을 사용할 필요가 있으며, 출력에서 ​​Shift-JIS 인코딩을 사용합니다. 그렇지 않으면 문자를 변환하지 못합니다. – Artyom

관련 문제