如何使用Visual Studio在C中将输出控制台打印到Unicode?

时间:2017-10-01 12:37:24

标签: c windows visual-studio unicode

正如问题所说,为了将Unicode字符打印到输出控制台,我是否必须这样做?我必须使用什么设置?现在我有这个代码:

wchar_t* text = L"the 来";
wprintf(L"Text is %s.\n", text);
return EXIT_SUCCESS;

并打印: Text is the ?.

我试图将输出控制台的字体更改为MS Mincho,Lucida Console和其他一些字体,但它们仍然不显示日文字符。

那么,我该怎么做?

4 个答案:

答案 0 :(得分:4)

这是适用于我的代码(VS2017) - 启用了Unicode的项目

#include <stdio.h>
#include <io.h>
#include <fcntl.h>

int main()
{
    _setmode(_fileno(stdout), _O_U16TEXT);
    wchar_t * test = L"the 来. Testing unicode -- English -- Ελληνικά -- Español." ;

    wprintf(L"%s\n", test);
}

这是控制台

output

将其复制到Notepad ++后,我看到了正确的字符串

来。测试unicode - 英语 - Ελληνικά - Español。

操作系统 - Windows 7英语,控制台字体 - Lucida控制台

答案 1 :(得分:2)

问号通常表示Windows无法将字符转换为目标代码页。在控制台中,空心方块表示Unicode字符已正确接收但无法显示,因为控制台字体不支持它,或者它是一个复杂的脚本,需要Uniscribe控制台无法处理。您可以复制方块并将其粘贴到记事本/写字板中,它应该正确显示。

WriteConsoleW Windows函数可以显示Unicode字符并一直工作回Windows NT。它只能写入控制台,因此在重定向输出时必须使用WriteFileGetConsoleMode在重定向的句柄上失败。

你没有说你正在使用哪个VS版本,并且这些年来情况发生了变化,但是如果你在main()早期调用_setmode(_fileno(stdout), _O_U16TEXT);,那么自VS2005以来Unicode输出就不错了:

#include <stdio.h>
#include <io.h>
#include <fcntl.h>

int main()
{
    _setmode(_fileno(stdout), _O_U16TEXT); // Call this before writing anything

    wchar_t * test = L"the 来" ;
    wprintf(L"Text is %s.\n", test);
    return 0;
}

另请参阅:Myth busting in the console

答案 2 :(得分:0)

字符'来'可能不在您的系统字符代码页中。您需要将字符保存为utf-8。

在vs2013中,我试试这个:

// save as utf-8
#pragma execution_character_set( "utf-8" )

#include <Windows.h>

char *s = "the 来";

int main(){
    // set console code page to utf-8
    SetConsoleOutputCP(65001);
    printf("%s\n",s);
    return 0;
}

答案 3 :(得分:0)

这对我有用:

#include <locale.h>

在主函数中,

setlocale(LC_ALL, "en_US.UTF-8");