好的,所以在发布this question之后,我尝试使用社区指出的相关问题(特别是this)中提供的解决方案,但我遇到了另一个问题。
当尝试使用_setmode()
函数更改Windows控制台以打印UTF字符时,我收到一个调试错误,就像this other question上发布的错误一样。调试错误如下:
文本:
Debug Assertion失败!
程序: ... KOUT-Desktop_Qt_5_5_0_MSVC2013_64bit-调试\调试\ Breakout.exe 文件:f:\ dd \ vctools \ crt \ crtw32 \ stdio \ output.c 行:1033
表达式:((_Stream-> _flag& _IOSTRG)||(fn = _fileno(_Stream),( (_textmode_safe(fn)== _IOINFO_TM_ANSI)&& !_tm_unicode_safe(FN))))
有关程序如何导致断言失败的信息,请参阅有关断言的Visual C ++文档。
(按重试调试应用程序)
截图:
如果没有_setmode()
功能,我仍然无法从上面的ASCII表中打印字符,如下所示:"┌──┐"。我该怎么做才能解决这个问题?具有相同问题的问题的解决方案也不起作用。
同样,我在Windows上使用Qt Creator,Qt版本5.5.0 MSVC 64位。编译器是Microsoft Visual C ++编译器12.0(amd64)。
这是一个导致错误的小示例代码:
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
int main(void)
{
//Using setmode to force the error
_setmode(_fileno(stdout), _O_U16TEXT);
printf("Hello World!\n");
return 0;
}
执行时会出现错误。
答案 0 :(得分:0)
似乎如果将输出模式设置为UTF-16,则必须使用wprintf而不是printf。
(据推测,既然你告诉运行时要从UTF-16翻译,你必须提供 UTF-16。)
此代码在我的机器上运行:
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
int main(void) {
_setmode(_fileno(stdout), _O_U16TEXT);
wprintf(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd\n");
return 0;
}
也是如此
wprintf(L"Hello world!\n");
PS - 我不确定这是否会解决您的潜在问题,我怀疑这与源文件的编码有关。即使使用UTF-16 解决您的问题,它也可能不是最佳解决方案。