2010-03-30 7 views
6

im tyring aby uzyskać to do pracy:jak napisać unicode Hello World w C na windows


#define UNICODE 
#define _UNICODE 
#include <wchar.h> 

int main() 
{ 
    wprintf(L"Hello World!\n"); 
    wprintf(L"£안, 蠀, ☃!\n"); 
    return 0; 
} 

za pomocą Visual Studio 2008 Express (w systemie Windows XP, jeśli ma to znaczenie). gdy uruchamiam to z poziomu wiersza poleceń (zaczynał jako cmd/u, który ma umożliwić Unicode?) I uzyskać w ten sposób:

 
C:\dev\unicodevs\unicodevs\Debug>unicodevs.exe 
Hello World! 
┬ú∞ 
C:\dev\unicodevs\unicodevs\Debug> 

który Przypuszczam można było oczekiwać biorąc pod uwagę, że terminal nie posiada czcionkę oddać je. ale co wpędza mnie jest to, że nawet, gdy próbuję to:

 
C:\dev\unicodevs\unicodevs\Debug>cmd /u /c "unicodevs.exe > output.txt" 

plik produkowane (choć jego kodowanie UTF-8) wygląda następująco:

 
Hello World! 
壓 

sam plik źródłowy jest zdefiniowany jako unicode (kodowane w UTF-8 bez BOM). wyjście kompilator gdy budynek:

 
1>------ Rebuild All started: Project: unicodevs, Configuration: Debug Win32 ------ 
1>Deleting intermediate and output files for project 'unicodevs', configuration 'Debug|Win32' 
1>Compiling... 
1>main.c 
1>.\main.c(1) : warning C4005: 'UNICODE' : macro redefinition 
1>  command-line arguments : see previous definition of 'UNICODE' 
1>.\main.c(2) : warning C4005: '_UNICODE' : macro redefinition 
1>  command-line arguments : see previous definition of '_UNICODE' 
1>Note: including file: C:\Program Files\Microsoft Visual Studio 9.0\VC\include\wchar.h 
1>Note: including file: C:\Program Files\Microsoft Visual Studio 9.0\VC\include\crtdefs.h 
1>Note: including file: C:\Program Files\Microsoft Visual Studio 9.0\VC\include\sal.h 
1>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\sal.h(108) : warning C4001: nonstandard extension 'single line comment' was used 
1>Note: including file: C:\Program Files\Microsoft Visual Studio 9.0\VC\include\crtassem.h 
1>Note: including file: C:\Program Files\Microsoft Visual Studio 9.0\VC\include\vadefs.h 
1>Note: including file: C:\Program Files\Microsoft Visual Studio 9.0\VC\include\swprintf.inl 
1>Note: including file: C:\Program Files\Microsoft Visual Studio 9.0\VC\include\wtime.inl 
1>Linking... 
1>Embedding manifest... 
1>Creating browse information file... 
1>Microsoft Browse Information Maintenance Utility Version 9.00.30729 
1>Copyright (C) Microsoft Corporation. All rights reserved. 
1>Build log was saved at "file://c:\dev\unicodevs\unicodevs\unicodevs\Debug\BuildLog.htm" 
1>unicodevs - 0 error(s), 3 warning(s) 
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ========== 

jakieś pomysły na to, co robię źle? podobne pytania na ST (takie jak ten: unicode hello world for C?) wydają się odnosić do * nix builds - o ile rozumiem, setlocale() nie jest dostępny dla Windows.

Próbowałem również zbudować to za pomocą kodu :: blocks/mingw gcc, ale otrzymałem takie same wyniki.

Odpowiedz

5

To nie jest pisanie (wprintf), to jest problem, jest to przekierowanie cmd wyjścia, które powoduje problem. Możesz wypróbować testowanie, pisząc bezpośrednio do pliku. W takim przypadku możesz następnie uruchomić Notatnik (lub raczej funkcję Windows API), nie zgadując poprawnie i interpretując tekst jako ASCII niepoprawnie, jeśli piszesz tylko kilka słów. W takim przypadku musisz najpierw zapisać znaki BOM w pliku.

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

int main() 
{ 
    FILE *out; 
    char bom[] = "\xFF\xFE"; 
    wchar_t s[] = L"中文!"; 
    size_t c; 

    out = fopen ("out.txt", "w"); 
    if(out == NULL) 
    { 
     perror("out.txt"); 
     return 1; 
    } 

    c = fwrite(bom, 1, 2, out); 
    if(c != 2) 
    { 
     perror ("Fatal write error."); 
     fclose(out); 
     return 2; 
    } 

    c = fwrite(s, sizeof(wchar_t), wcslen(s), out); 
    if(c != wcslen(s)) 
    { 
     perror ("Fatal write error."); 
     fclose(out); 
     return 2; 
    } 

    fclose(out); 

    return 0; 
}