为了得到这个工作:
#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; }