2011-09-21 2 views
7

wchar_t * 문자열을 인쇄하려고합니다. 코드는 아래에 간다 :char 대 wchar_t

#include <stdio.h> 
#include <string.h> 
#include <wchar.h> 

char *ascii_ = "中日友好"; //line-1 
wchar_t *wchar_ = L"中日友好"; //line-2 

int main() 
{ 
    printf("ascii_: %s\n", ascii_); //line-3 
    wprintf(L"wchar_: %s\n", wchar_); //line-4 
    return 0; 
} 

//Output 
ascii_: 中日友好 

질문 :

  1. 은 분명히 내가 라인 1 * 포인터를 숯불에 CJK 문자를 할당해서는 안됩니다,하지만 난 단지 그것을했고, 라인의 출력 -3 맞아, 왜? 3 행의 printf()가 비 ASCII 문자를 어떻게 줄 수 있습니까? 어떻게 든 인코딩을 알고 있습니까?

  2. 라인 2와 라인 4의 코드가 맞다고 가정하지만, 왜 라인 4의 결과물을 얻지 못했을까요?

+0

어떤 컴파일러를 사용하고 있습니까? GCC는 Utf-8 대부분의 플랫폼을 기본값으로 사용합니다. 나에게 인코딩 문제처럼 보입니다. – cyco130

+0

@ cyco130, 예, gcc – Alcott

답변

8

우선, 일반적으로 소스 코드에 비 ASCII 문자를 사용하는 것은 좋지 않습니다. 아마 일어나는 일은 중국어 문자가 ascii와 함께 작동하는 UTF-8로 인코딩되고 있다는 것입니다.

이제 wprintf()이 작동하지 않는 이유는 무엇입니까? 이것은 스트림 방향과 관련이 있습니다. 각 스트림은 일반 또는 와이드로만 설정할 수 있습니다. 일단 설정되면 변경할 수 없습니다. 처음 사용될 때 설정됩니다. (이것은 printf으로 인해 ascii입니다). 그 후 잘못된 방향으로 인해 wprintf이 작동하지 않습니다.

즉, printf()을 사용하면 printf()을 계속 사용해야합니다. 마찬가지로 wprintf()으로 시작하는 경우 계속 wprintf()을 사용해야합니다.

printf()wprintf()을 혼용 할 수 없습니다. (윈도우 제외)

편집 :

wprintf 라인은 그 자체로도 작동하지 않는 이유에 대한 질문에 대답합니다. 中日友好의 UTF-8 형식이 wchar_에 저장되도록 코드가 컴파일되고 있기 때문일 수 있습니다. 그러나 wchar_t에는 4 바이트 유니 코드 인코딩이 필요합니다.

  1. wchar_t 신경, 그냥 멀티 바이트 char의 고수하지 마십시오 (Windows의 2 바이트)

    그래서 내가 생각할 수있는 두 가지 옵션이있다. 이것은 쉬운 방법이지만 사용자의 시스템이 중국어 로켈로 설정되어 있지 않으면 중단 될 수 있습니다.
  2. wchar_t을 사용하십시오. 그러나 유니 코드 이스케이프 시퀀스를 사용하여 중국어 문자를 인코딩해야합니다. 이것은 분명히 소스 코드에서 읽을 수 없게 만들지 만, 로케일에 상관없이 한자 글꼴을 인쇄 할 수있는 모든 컴퓨터에서 작동합니다.
+0

유니 코드 이스케이프 시퀀스를 사용하는 경우 각 중국어 단어의 seq를 알아 내야합니다. 그러면 할 일이 많을 것입니다. P – Alcott

+1

맞습니다. 그러나이 도구가 온라인에서 도구 모음을 찾을 수있는 곳이라면 중국어 텍스트를 복사하여 붙여 넣기 만하면 유니 코드 이스케이프 문자열을 얻을 수 있습니다. 코드를 읽을 수있게 유지하려면 이스케이프 시퀀스 옆의 실제 중국어 텍스트를 주석으로 유지할 수 있습니다. – Mysticial

+0

감사합니다. 미스테리 – Alcott

6

라인 1은 ASCII가 아니며, 컴파일시 컴파일러가 멀티 바이트 인코딩을 사용합니다. 현대 시스템에서는 아마도 UTF-8 일 것입니다. printf은 인코딩을 알지 못합니다. 그냥 stdout에 바이트를 보내는 중이고, 인코딩이 일치하는 한 모든 것이 정상입니다.

줄 3과 4가 함께 정의되지 않은 동작을 호출한다는 점에 유의해야합니다. FILE (stdout)에 문자 기반 문자와 와이드 문자 문자를 함께 사용할 수 없습니다.첫 번째 작업 후 FILE은 "방향"(바이트 또는 너비)을 가지고 있으며, 그 후에 반대 방향의 작업을 수행하려는 시도는 UB가됩니다.

+0

printf() 줄, 일부 출력 있지만 중국어 문자가 있어요. 왜? – Alcott

+0

아마 로케일의 인코딩이 잘못되었을 것입니다. –

+0

로케일의 인코딩은 무엇입니까? 그것을 고치는 방법? – Alcott

1

한 단계를 생략하고 있으므로 잘못된 길을 생각하고 있습니다.

디스크에 바이트가 들어있는 C 파일이 있습니다. "ASCII"문자열과 넓은 문자열이 있습니다.

ASCII 문자열은 줄 1에있는 것과 똑같이 바이트를 가져 와서 출력합니다. 사용자 측의 인코딩이 프로그래머 측의 인코딩과 동일한 경우에만 작동합니다.

와이드 문자열은 먼저 주어진 바이트를 유니 코드 코드 포인트로 디코딩하고 프로그램에 저장합니다. 출력시 사용자 측면의 인코딩에 따라 다시 인코딩됩니다. 이렇게하면 이러한 문자가 입력 될 때가 아니라 의도 한대로 문자가 출력됩니다.

컴파일러가 잘못된 인코딩을 가정하거나 출력 터미널이 잘못된 방식으로 설정되어 있습니다.

관련 문제