2010-03-30 24 views
6

IM tyring來得到這個工作:使用Visual Studio 2008速成怎麼寫的Unicode的hello world用C在Windows


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

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

(在Windows XP上,如果它的事項)。 當我從命令提示符下運行這個(開始爲CMD/U這是爲了使Unicode的?)我得到這個:

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

我估計是因爲終端不具備的字體可以預期渲染那些。 但什麼讓我的是,即使我嘗試這個辦法:

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

產生的(即使它的UTF-8編碼)文件的樣子:

 
Hello World! 
壓 

源文件本身被定義爲Unicode (以不含BOM的UTF-8編碼)。 編譯器輸出時的建築:

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

什麼我做錯了任何想法? ST上的類似問題(如這個:unicode hello world for C?)似乎是指* nix構建 - 據我瞭解,setlocale()不適用於windows。

我也嘗試使用code :: blocks/mingw gcc構建,但得到了相同的結果。

回答

5

這不是寫(wprintf)這就是問題,它是導致問題的輸出的cmd重定向。您可以嘗試直接寫入文件進行測試。在這種情況下,如果你只寫了幾個字,你可能會碰到記事本(或者說Windows API函數)不正確猜測,並將你的文本解釋爲ASCII碼錯誤。在這種情況下,您還需要首先將BOM字符寫入文件中。

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