在Windows PowerShell中,我使用了chcp 65001
并选择了一种包含我想要的所有字符的字体。
如果我显示带有type file.u8
的UTF-8文件,则它工作正常,并且我得到了所需的字符。
如果我运行myprogram.exe
,那么在第一个非ASCII字符之后我不会得到无输出(如果在chcp 65001
之前运行,则会产生 mojibake )。
如果我先运行myprogram.exe > test.u8
,然后运行type test.u8
,则可以,并且我得到所需的输出。
所以我想我可以使用myprogram.exe | % {echo "$_"}
绕过文件(使用我有限的PowerShell知识!),并且可以。因此,当C ++运行时直接与中断UTF-8输出的控制台进行通讯时,似乎在执行特殊动作。
(如果我使用宽字符,我可以获得所需的输出,但是我实际上并不需要最后的UTF-16输出,我想要的是UTF-8。我只是想要方便无需额外的字符转换即可打印调试信息)
答案 0 :(得分:1)
在与@eryksun进行评论交流时,我意识到我忽略了一个实验:我尝试使用 wide 字符的所有尝试均成功。那么,如果type
和echo
实际上能够读取UTF-8并输出宽字符怎么办?所以我重定向到一个文件:
myprogram.exe | % {echo "$_"} > test.txt
现在检查那个文本文件,记事本将其检测为“ UCS-2 LE BOM”。实际上,所有有效的情况(type
,所有重定向到文件等)都产生多字节字符。甚至type foo.u8 > foo.txt
都显示出预期的大小增加。
真正的问题不是我的程序(该程序成功输出了UTF-8),而是有几项功能可以将其无声地转换为Windows所喜欢的东西。