2013-04-08 3 views
2

코드 :왜 wprintf가 유니 코드 합자를 두 개의 다른 글씨체로 분리합니까?

#include <stdio.h> 
#include <wchar.h> 
#define USE_W 
int main() 
{ 
#ifdef USE_W 
    const wchar_t *ae_utf16 = L"\x00E6 & ASCII text ae\n"; 
    wprintf(ae_utf16); 
#else 
    const char *ae_utf8 = "\xC3\xA6 & ASCII text ae\n"; 
    printf(ae_utf8); 
#endif 
    return 0; 
} 

출력 :

AE & ASCII 텍스트 AE

의 printf는 올바른 UTF-8로 출력을 생성하는 동안

:

æ & ASCII 텍스트 AE를

이 테스트는 here입니다.

답변

1

printf은 터미널에 원시 바이트를 보냅니다. 인코딩에 대해서는 아무 것도 모른다. 터미널이 UTF-8로 해석되도록 구성된 경우 올바른 문자가 표시됩니다.

wprintf은 인코딩에 대해 알고 있습니다. behaves as though은 넓은 문자 (wchar_t)를 현재 로캘에 따라 에 멀티 바이트 시퀀스로 인코딩하는 함수를 사용합니다.. 기본 로케일이 매우 최소한 인 "C" 일 경우 문자 æ이 "다소 같음"바이트 시퀀스 ae으로 변환됩니다.

로케일을 "en_US.UTF-8"과 같이 UTF-8을 사용하여 명시 적으로 설정하면 출력은 is as expected입니다. 물론 지원되는 로케일 세트는 시스템마다 다르므로이 코드를 하드 코딩하는 것은 좋지 않습니다.

+0

wprintf를 사용하기 전에 로케일 설정 요구 사항에 대한 정보를 제공해 주셔서 감사합니다. – user206334

+0

이것은 Linux에서 작동합니다. Windows에서 로케일을 UTF-8 코드 페이지로 설정하려고하면 [실패합니다] (https://msdn.microsoft.com/en-us/library/x99tb11d.aspx). AFAICT,'wprintf'는 거기에 UTF-8 문자열을 인쇄하는 데 사용할 수 없습니다. [WriteConsole] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms687401 (v = vs.85) .aspx)이 필요합니다. – mgiuffrida