Windows控制台至少在过去十年中已经支持Unicode,可能还可以追溯到Windows NT。然而出于某种原因,包括Perl和Python在内的主要跨平台脚本语言仅输出各种8位编码,需要大量麻烦才能解决。Perl会发出“在打印中宽字符”的警告,Python会给出charmap错误并退出。这么多年过去了,为什么它们不只是简单地调用Win32 -W API以输出UTF-16 Unicode,而是强制将所有内容通过ANSI/codepage瓶颈呢?
这只是因为跨平台性能不够重要吗?是因为这些语言在内部使用UTF-8,并发现输出UTF-16太麻烦了吗?还是-W API本质上有如此严重的缺陷,无法直接使用?
更新
看起来责任可能需要由所有各方共同承担。我想象中脚本语言可以在Windows上调用wprintf,让操作系统/运行时处理诸如重定向之类的事情。但事实证明,即使在Windows上,甚至wprintf也会在打印到控制台之前将宽字符转换为ANSI,然后再转换回来!
如果此问题已得到解决,请告知我,因为错误报告链接似乎已损坏,但我的Visual C测试代码仍无法通过wprintf,WriteConsoleW则可以。
更新2
实际上,您可以使用
这只是因为跨平台性能不够重要吗?是因为这些语言在内部使用UTF-8,并发现输出UTF-16太麻烦了吗?还是-W API本质上有如此严重的缺陷,无法直接使用?
更新
看起来责任可能需要由所有各方共同承担。我想象中脚本语言可以在Windows上调用wprintf,让操作系统/运行时处理诸如重定向之类的事情。但事实证明,即使在Windows上,甚至wprintf也会在打印到控制台之前将宽字符转换为ANSI,然后再转换回来!
如果此问题已得到解决,请告知我,因为错误报告链接似乎已损坏,但我的Visual C测试代码仍无法通过wprintf,WriteConsoleW则可以。
更新2
实际上,您可以使用
_setmode(_fileno(stdout), _O_U16TEXT)
在C中将UTF-16打印到控制台,但前提是您必须这样做。
您可以在代码页设置为65001的控制台中从C打印UTF-8,但Perl、Python、PHP和Ruby都存在错误,阻止了这一点。Perl和PHP通过在至少包含一个宽字符的行后添加额外的空行来破坏输出。Ruby有稍微不同的破坏输出。Python会崩溃。
更新3
Node.js是第一个没有这个问题的脚本语言,直接使用即可。
Python开发团队慢慢意识到这是一个真正的问题,因为它最初于2007年底首次报告,并在2016年看到了大量活动,以完全理解和修复该错误。