Linux vs. Windows: 控制台如何渲染Unicode字符?

3
这是一个相当低级的(从“更接近底层”意义上来说)问题。
我想知道是否有人能够为我指出文档、解释等,说明在接收到Unicode字符(或任何字符代码,但我特别关心Unicode标准)后,Windows中的控制台(使用代码页65001)和Linux中的xterm(使用LC_CTYPE=en_US.UTF-8)如何查找相应的字形(以及在哪里查找)。
我知道在Windows中可能更难知道,但我确实找不到太多信息。
谢谢。
3个回答

3
据我所知,cmd.exe绑定了您定义为“非Unicode程序的代码页”的256个字符代码页。
具体来说,如果我将上述设置设置为日语,则cmd.exe会突然用日元符号替换反斜杠(系统上的每个非Unicode应用程序也是如此),并正确解释ShiftJIS代码。 将其设置为荷兰语会给我一个带重音的I(我忘记了哪个),而另一个代码页会在相同的字符上显示半填充垂直实心。不是Unicode,Unicode可以让我同时执行这三个操作。

它不必是256个字符:shift-JIS实际上是一个MBCS。是的,在Windows中它确实有日元符号/反斜杠混淆,这非常令人遗憾,可能来自DOS... - SamB
1
澄清一下,在Windows中,所有日文字体都会这样做。无论应用程序是否为Unicode都没有关系!不相信?在charmap中查找MS Mincho中的U+005C,或者参见http://blogs.msdn.com/b/michkap/archive/2007/03/28/1972239.aspx。 - SamB

1

控制台使用从代码页创建的编码的TextWriter。这意味着编写的字符将使用特定于代码页的Encoding对象编码为字节。


他在非常具体地谈论cmd.exe,据我所知,它不是一个.Net应用程序,因此逻辑上它不使用TextWriter。除非还有另一个我不知道的TextWriter。 - Kawa
是的,我刚刚检查过了。在进程资源管理器中它并没有显示成黄色。 - Kawa
如果我们将其限制在控制台本身,它根本不支持Unicode字符。如果当前编码不是UTF-8并且您尝试显示UTF-8文件,则会使用当前编码进行解码,这当然会使ASCII字符范围之外的任何内容混乱。即使当前编码为UTF-8,它仍然不支持Unicode字符,只支持作为UTF-8编码的字符。 - Guffa
控制台完全支持Unicode...只有当您将其视为文件或使用“OEM”API时,它才使用当前代码页。此外,我并不完全确定UTF-8代码页是否真的适用于控制台... - SamB

1

控制台不支持Unicode。 :)


是的,那就是我之前所暗示的。 - Kawa
在最近的Linux系统上,这不是真的。 - Joachim Sauer
对于“近期”的定义至少可以追溯到1996年的控制台。如果你指的是终端仿真器,UTF-8的支持已经在1999年被添加到XTerm中,并且在某些其他终端仿真器中已经存在。 - AProgrammer
终端仿真器速度更快,但控制台(即:如果X未运行,您通常会看到的环境)仅在最近几年才学会了这一点。 - Joachim Sauer
我相当确定在1998年1月搬家之前,我曾在控制台上使用过它,并且相关文档存在于内核2.0.1中。如果我的记忆是正确的,我不需要使用特殊选项编译内核,只需发送正确的转义序列即可。更近期发生的可能是在常见的发行版中默认启用它(我记得他们在2005年左右全球切换到UTF-8)。 - AProgrammer
@AProgrammer:当然,UTF-8 可以在控制台上很容易地使用;问题是,你不能在文本模式下获得超过 512 个字形,因此你只能获得一组非常有限的实际可显示字符... - SamB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接