2010-03-30 23 views
6

im tyring để có được điều này để làm việc:làm thế nào để viết unicode hello world trong C trên cửa sổ


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

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

sử dụng Visual Studio 2008 Express (trên cửa sổ xp, nếu vấn đề). khi tôi chạy này từ dấu nhắc lệnh (bắt đầu như cmd/u mà là vụ phải cho phép unicode?) Tôi có được điều này:

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

mà tôi giả sử là để được mong đợi cho rằng các thiết bị đầu cuối không có font để hiển thị chúng. nhưng những gì được tôi là ngay cả khi tôi cố gắng này:

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

file tạo ra (mặc dù UTF-8 của nó được mã hóa) trông giống như:

 
Hello World! 
壓 

nguồn tập tin riêng của mình được định nghĩa là unicode (được mã hóa bằng UTF-8 không có BOM). kết quả của trình biên dịch khi xây dựng:

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

bất kỳ ý tưởng nào về những gì tôi đang làm sai? câu hỏi tương tự trên ST (như thế này: unicode hello world for C?) dường như đề cập đến * nix xây dựng - theo như tôi hiểu setlocale() không có sẵn cho cửa sổ.

tôi cũng đã thử xây dựng mã này bằng cách sử dụng :: blocks/mingw gcc, nhưng có cùng kết quả.

Trả lời

5

Nó không phải là viết (wprintf) đó là vấn đề, đó là chuyển hướng cmd đầu ra gây ra vấn đề. Bạn có thể thử kiểm tra bằng cách ghi trực tiếp vào tệp thay thế. Trong trường hợp đó, sau đó bạn có thể chạy vào notepad (hoặc đúng hơn là chức năng của Windows API) không đoán chính xác và giải thích văn bản của bạn dưới dạng ASCII không chính xác nếu bạn chỉ viết một vài từ. Trong trường hợp đó, bạn cũng cần phải viết các ký tự BOM vào tệp đầu tiên.

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