如何在windows上用C写unicode hello world

为了得到这个工作:

#define UNICODE #define _UNICODE #include <wchar.h> int main() { wprintf(L"Hello World!\n"); wprintf(L"£안, 蠀, ☃!\n"); return 0; } 

使用Visual Studio 2008 express(在Windows XP上,如果有的话)。 当我从命令提示符运行(开始为应该启用unicode的cmd / u?)我得到这个:

 C:\ dev的\ unicodevs \ unicodevs \debugging> unicodevs.exe
你好,世界!
 ┬ú∞
 C:\ dev的\ unicodevs \ unicodevs \debugging>

我想这是预料的,因为terminal没有字体来渲染这些。 但是,得到我的是,即使我试试这个:

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

生成的文件(即使它的UTF-8编码)看起来像:

你好,世界!
 壓

源文件本身被定义为unicode(用UTF-8编码,没有BOM)。 编译时输出:

 1> ------重build全部开始:项目:unicodevs,configuration:Debug Win32 ------
 1>删除项目“unicodevs”的中间文件和输出文件,configuration“Debug | Win32”
 1>正在编译...
 1> main.c中
 1>。\ main.c(1):警告C4005:'UNICODE':macros重新定义
 1>命令行参数:参见以前定义的'UNICODE'
 1>。\ main.c(2):警告C4005:'_UNICODE':macros重新定义
 1>命令行参数:参见以前定义的'_UNICODE'
 1>注意:包括文件:C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ wchar.h
 1>注意:包括文件:C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ crtdefs.h
 1>注意:包括文件: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):警告C4001:使用非标准扩展名“单行注释”
 1>注意:包括文件:C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ crtassem.h
 1>注意:包括文件:C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ vadefs.h
 1>注意:包括文件:C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ swprintf.inl
 1>注意:包括文件:C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ wtime.inl
 1>链接...
 1>embedded清单...
 1>创build浏览信息文件...
 1> Microsoft浏览信息维护实用程序版本9.00.30729
 1>版权所有(C)Microsoft Corporation。 版权所有。
 1>生成日志保存在“file:// c:\ dev \ unicodevs \ unicodevs \ unicodevs \ Debug \ BuildLog.htm”
 1> unicodevs  -  0个错误,3个警告(s)
 ==========全部重build:1次成功,0次失败,0次跳过==========

关于我在做什么错误的任何想法? 类似的ST上的问题(如这个: unicode hello world for C? )似乎是指* nix构build – 就我所知,setlocale()不适用于windows。

我也尝试使用code :: blocks / mingw gcc构build这个,但得到了相同的结果。

这不是写(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; }