中国服务器网

服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器

Learn more

为什么脚本语言不能将Unicode输出到Windows控制台?

Windows控制台至less有十年的时间了,而且可能早于Windows NT。 然而由于某些原因,包括Perl和Python在内的主要跨平台脚本语言只能输出各种8位编码,需要很多麻烦才能解决。 Perl给出了一个“宽字符打印”警告,Python给出一个charmap错误并退出。 为什么这些年来,他们不只是简单地调用输出UTF-16 Unicode的Win32-W API,而不是通过ANSI /代码页瓶颈强制所有的东西? 仅仅是跨平台性能低优先级? 难道这些语言在内部使用UTF-8,并且发现它太费心地输出UTF-16了吗? 或者是-W API固有地破坏到不能被原样使用的程度? UPDATE 似乎这个责任可能需要各方分担。 我想到脚本语言只能在Windows上调用wprintf ,并让操作系统/运行时间担心redirect等问题。 但事实certificate, 即使Windows上的wprintf转换宽字符为ANSI,然后再打印到控制台 ! 请让我知道,如果这已被修复,因为错误报告链接似乎中断,但我的Visual Ctesting代码仍然失败的wprintf和WriteConsoleW成功。 更新2 实际上你可以使用wprintf从C语言打印UTF-16到控制台,但是只有当你第一次使用_setmode(_fileno(stdout), _O_U16TEXT) 。 从C中可以打印UTF-8到代码页设置为代码页65001的控制台,但是Perl,Python,PHP和Ruby都有这样的错误。 Perl和PHP通过在包含至less一个宽字符的行之后添加额外的空行来破坏输出。 Ruby有不同的错误输出。 Python崩溃。 更新3 Node.js是第一个没有这个问题的脚本语言。 Python开发团队慢慢地意识到这是一个真正的问题,因为它是在2007年底第一次报告的,并且看到了大量的活动来充分理解和完全修复2016年的bug。