这些年来,我使用过不少编程语言,同时也是一个爱好语言学并为Wiktionary做出贡献的业余学者。我一直在开发一些工具,以便从命令行查询Wiktionary,但遇到了意想不到的问题。
Perl和Python都不能在*nix和Windows下原生地将Unicode输出到控制台(虽然有各种解决方案)。主要原因是*nix操作系统喜欢UTF-8编码的Unicode,而Windows则喜欢UTF-16编码的Unicode。但似乎Windows很难使用宽字符与控制台交互,即使控制台和wprintf都支持宽字符。
那么问题来了,如果我把目光放远一些,看看Java、C#、Scala等语言,情况会变得更好吗?或者有没有一些最初是在Windows上开发,后来又移植到*nix平台的脚本语言呢?
以下是一些理想的伪代码:
function main()
{
print( L"hello, 世界" );
}
WriteConsoleW
而不是WriteFile
,打破了一个抽象屏障……因此这不是真正的语言问题,而是库设计问题。 - user541686SetOutputCP(CP_UTF8)
并尝试以不同的方式将UTF-8数据写入控制台,则会发现一些奇怪的行为。UTF-8输出可以通过fputs和其他一些API工作,但您无法像std::cout那样单独写入每个字节。 - bames53win-unicode-console
包 可以透明地调用WriteConsoleW()
,而不需要修改你的Python脚本(print(u"hello, 世界")
)。 - jfs