我想让这个工作:
#define UNICODE
#define _UNICODE
#include <wchar.h>
int main()
{
wprintf(L"Hello World!\n");
wprintf(L"£안, 蠀, ☃!\n");
return 0;
}
使用visualstudio2008express(在windows xp上,如果重要的话)。
当我在命令提示符下运行这个命令时(启动时是命令/u,应该启用unicode?)我明白了:
C:\dev\unicodevs\unicodevs\debug>unicodevs.exe
你好,世界!
_∞
C:\dev\unicodevs\unicodevs\debug>
我想这是意料之中的,因为终端没有呈现这些内容的字体。
但让我感动的是,即使我试着这样做:
C:\dev\unicodevs\unicodevs\debug>cmd/u/C“unicodevs.exe>output.txt”
生成的文件(即使其utf-8编码)看起来像:
你好,世界!
英镑
源文件本身被定义为unicode(用utf-8编码,不带bom)。
生成时的编译器输出:
1>----全部重新生成已启动:项目:unicodevs,配置:调试win32---
1>删除项目“unicodevs”、配置“debug”win32的中间文件和输出文件
1>编译…
1>主C
1>\main.c(1):警告C4005:“Unicode”:宏重新定义
1>命令行参数:请参阅前面的“unicode”定义
1>\main.c(2):警告C4005:“\u Unicode”:宏重新定义
1>命令行参数:请参阅前面的“uUnicode”定义
1>注意:包含文件:c:\程序文件\Microsoft Visual Studio 9.0\vc\include\wchar.h
1>注意:包含文件:c:\程序文件\Microsoft Visual Studio 9.0\vc\include\crtdefs.h
1>注意:包含文件:c:\程序文件\Microsoft Visual Studio 9.0\vc\include\sal.h
1>C:\程序文件\Microsoft Visual Studio 9.0\vc\include\sal.h(108):警告C4001:使用了非标准扩展名“单行注释”
1>注意:包含文件:c:\程序文件\Microsoft Visual Studio 9.0\vc\include\crtassem.h
1>注意:包含文件:c:\程序文件\Microsoft Visual Studio 9.0\vc\include\vadefs.h
1>注意:包含文件:c:\程序文件\Microsoft Visual Studio 9.0\vc\include\swprintf.inl
1>注意:包含文件:c:\程序文件\Microsoft Visual Studio 9.0\vc\include\wtime.inl
1>链接…
1>嵌入清单…
1>正在创建浏览信息文件…
1>Microsoft Browse信息维护实用程序版本9.00.30729
1>版权所有(C)Microsoft Corporation。保留所有权利。
1>生成日志保存在“file://c:\dev\unicodevs\unicodevs\unicodevs\debug\build log.htm”
1>Unicodevs-0个错误,3个警告
====全部重建:1成功,0失败,0跳过==========
你知道我做错了什么吗?
关于st的类似问题(比如这个:unicode hello world for C?)似乎指的是*nix构建-据我所知,setLocale()不适用于Windows。
我也尝试过使用code::blocks/mingw gcc构建它,但得到了相同的结果。
最佳答案
问题不在于写入(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;
}