如何在Windows上用C语言编写Unicode版的Hello World

6

我正在尝试让这个工作起来:


#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上,如果有关系的话)。 当我从命令提示符(启动为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(以UTF-8无BOM编码)。 编译器在构建时输出:

1>------ 重新生成全部开始: 项目: unicodevs,配置: Debug Win32 ------
1>正在删除项目 'unicodevs' 的中间文件和输出文件,配置为 'Debug | Win32'
1>编译...
1>main.c
1>.\main.c(1) : 警告 C4005: 'UNICODE' : 宏重新定义
1>        命令行参数:  请查看“UNICODE”的先前定义
1>.\main.c(2) : 警告 C4005: '_UNICODE' : 宏重新定义
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>嵌入程序集清单...
1>正在创建浏览信息文件...
1>Microsoft 浏览信息维护工具版本 9.00.30729
1>版权所有 (C) Microsoft Corporation。保留所有权利。
1>生成日志已保存在“file://c:\dev\unicodevs\unicodevs\unicodevs\Debug\BuildLog.htm”
1>unicodevs - 0 个错误,3 个警告
========== 重新生成全部: 成功 1 个,失败 0 个,跳过 0 个 ==========

你有什么想法吗?类似的问题在ST上(比如这个:unicode hello world for C?)似乎是关于*nix builds的,据我所知,setlocale()在Windows上不可用。

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

1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接