好的,所以在发布之后 this question我尝试使用社区指出的相关问题(特别是 this )中提供的解决方案,但我遇到了另一个问题。
当尝试使用 _setmode()
函数更改 Windows 控制台以打印 UTF 字符时,出现调试错误,就像 this other question 上发布的错误一样.调试报错如下:
正文:
调试断言失败!
程序: ...kout-Desktop_Qt_5_5_0_MSVC2013_64bit-Debug\debug\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++ Compiler 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;
}
执行时出现错误。
最佳答案
看来,如果将输出模式设置为 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 确实解决了您的问题,它也可能不是最佳解决方案。
关于c - _setmode 函数导致调试错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33905670/