2010-03-30 18 views
6

im tyring a conseguir que esto funcione:cómo escribir Unicode hola mundo en C en las ventanas


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

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

utilizando Visual Studio 2008 Express (en Windows XP, si importa). cuando funciono esto desde la línea de comandos (comenzó como cmd/u, que se supone que debe permitir a Unicode?) Me sale esto:

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

que supongo que era de esperar teniendo en cuenta que el terminal no tiene la fuente para renderizar esos. pero lo que me molesta es que incluso si intento esto:

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

el archivo producido (a pesar de que su codificación UTF-8) se ve así:

 
Hello World! 
壓 

el archivo de origen en sí se define como Unicode (codificado en UTF-8 sin BOM). la salida del compilador cuando edificio:

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

alguna idea de lo que estoy haciendo mal? preguntas similares sobre ST (como esta: unicode hello world for C?) parecen referirse a compilaciones de * nix: por lo que entiendo, setlocale() no está disponible para Windows.

También intenté construir esto usando code :: blocks/mingw gcc, pero obtuve los mismos resultados.

Respuesta

5

No es la escritura (wprintf) ese es el problema, es la redirección de cmd de salida lo que está causando el problema. Puede intentar las pruebas escribiendo directamente en el archivo. En ese caso, podría ejecutar en el bloc de notas (o, más bien, la función API de Windows) sin adivinar correctamente e interpretar su texto como ASCII incorrectamente si solo está escribiendo un par de palabras. En ese caso, también deberá escribir los caracteres BOM en el archivo primero.

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