2010-03-30 7 views
6

im tyring pour obtenir ce travail:comment écrire unicode Bonjour tout le monde en C sur les fenêtres


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

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

en utilisant Visual Studio 2008 Express (sur windows xp, si elle importe). quand je lance partir de l'invite de commande (a commencé comme cmd/u qui est censé permettre unicode?) Je reçois ceci:

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

que je suppose était à prévoir, étant donné que le terminal ne dispose pas de la police pour les rendre. mais ce qui me reçoit est que même si j'essaie ceci:

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

le fichier produit (même si son codage UTF-8) ressemble à:

 
Hello World! 
壓 

le fichier source lui-même est défini comme unicode (codé en UTF-8 sans nomenclature). la sortie du compilateur lors de la construction:

 
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 ========== 

des idées sur ce que je fais mal? questions similaires sur ST (comme celui-ci: unicode hello world for C?) semblent se référer à * nix builds - autant que je sache setlocale() n'est pas disponible pour Windows.

J'ai aussi essayé de construire ceci en utilisant code :: blocks/mingw gcc, mais j'ai obtenu le même résultat.

Répondre

5

Ce n'est pas l'écriture (wprintf) qui pose problème, c'est la redirection de la sortie cmd qui cause le problème. Vous pouvez essayer de tester en écrivant directement dans un fichier à la place. Dans ce cas, vous pourriez alors courir dans le bloc-notes (ou plutôt la fonction API de Windows) ne devinant pas correctement et interprétant votre texte comme ASCII incorrectement si vous écrivez seulement quelques mots. Dans ce cas, vous devez d'abord écrire les caractères de nomenclature dans le fichier.

#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; 
} 
Questions connexes