简体   繁体   English

如何在Windows上用C编写unicode hello world

[英]how to write unicode hello world in C on windows

im tyring to get this to work: 为了让这个工作:


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

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

using visual studio 2008 express (on windows xp, if it matters). 使用visual studio 2008 express(在windows xp上,如果重要的话)。 when i run this from the command prompt (started as cmd /u which is supposed to enable unicode ?) i get this: 当我从命令提示符(启动为cmd / u,它应该启用unicode?)运行时,我得到这个:

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

which i suppose was to be expected given that the terminal does not have the font to render those. 鉴于终端没有用于渲染它们的字体,我认为这是预期的。 but what gets me is that even if i try this: 但是,即使我尝试这个,我得到的是:

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

the file produced (even though its UTF-8 encoded) looks like: 生成的文件(即使其UTF-8编码)如下所示:

Hello World!
壓

the source file itself is defined as unicode (encoded in UTF-8 without BOM). 源文件本身被定义为unicode(以UTF-8编码,没有BOM)。 the compiler output when building: 构建时的编译器输出:

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

any ideas on what am i doing wrong ? 关于我做错什么的任何想法? similar questions on ST (like this one: unicode hello world for C? ) seem to refer to *nix builds - as far as i understand setlocale() is not available for windows. 关于ST的类似问题(比如这个: C的unicode hello world? )似乎是指* nix版本 - 据我所知,setlocale()不适用于Windows。

i also tried building this using code::blocks/mingw gcc, but got the same results. 我也尝试使用code :: blocks / mingw gcc构建它,但得到了相同的结果。

It's not the writing (wprintf) that's the problem, it's the cmd redirection of output that's causing the problem. 这不是写作(wprintf)的问题,而是导致问题的输出的cmd重定向。 You can try testing by writing directly to file instead. 您可以通过直接写入文件来尝试测试。 In that case, you might then run into notepad (or rather Windows API function) not guessing correctly and interpreting your text as ASCII incorrectly if you're just writing a couple of words. 在这种情况下,如果您只是写了几个单词,那么您可能会遇到记事本(或者更确切地说是Windows API函数)没有正确猜测并将您的文本解释为ASCII错误。 In which case, you'll need to write the BOM characters into the file first as well. 在这种情况下,您还需要首先将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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM