如何使控制台能够打印任意的65535个UNICODE字符。
如何使控制台能够打印任意的65535个UNICODE字符。
我正在尝试使用Unicode字符,并从Wikipedia页面获取Unicode值。
问题是我的控制台显示了所有的C0控制字符和基本拉丁字符,即从U+0000到U+00FF的字符,但对于其他类别如拉丁扩展-B,西里尔文,其他语言等,控制台打印出了问号字符(?)。
我的C#代码是
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DataTypes { class Program { static void Main(string[] args) { char ch = '\u0181'; Console.WriteLine("该Unicode字符的值为" + ch); } } }
我正在使用Windows 7,Visual Studio 2010。我应该怎么做来增加Unicode支持。
问题的原因是控制台模式应用程序只能使用8位文本编码。这是42年前由Ken Thompson等设计Unix时做出的设计决策的结果。Unix的一个核心特性是通过管道进行终端I/O,并且可以将一个程序的输出链接到另一个程序的输入上。Windows也实现了这个特性,并且.NET也通过ProcessStartInfo.RedirectStandardXxxx属性支持这个特性。
然而,当操作系统开始采用Unicode时,这个特性成为了一个问题。Windows NT是第一个完全基于Unicode的操作系统。Unicode字符必须始终进行编码,当一个程序输出16位编码的字符被重定向到一个仍然使用8位编码字符的程序时,就会出现问题。
Ken Thompson也找到了解决这个问题的方法,他发明了utf-8编码。在Windows中也可以使用这个编码。在控制台模式应用程序中很容易实现,只需重新分配Console.OutputEncoding属性。然而,你可能会遇到另一个问题,控制台窗口选择的字体可能无法渲染文本。按下Alt+Space调出系统菜单,选择属性,然后选择字体选项卡。你需要选择一个非光栅字体。可选择的字体非常有限,Vista及更高版本可以选择Consolas字体。重新运行程序,重音字符应该能够正确显示。不幸的是,通过编程方式强制控制台字体是一个问题,你需要记录这个配置步骤。此外,像Consolas这样的字体并没有包含所有可能的Unicode字符。对于没有字形的Unicode代码点,你可能会看到出现方框。这是一个不太明显的提醒,创建一个GUI程序可能是您最好的选择。
这是一个很好的解释!谢谢你的历史课 :)-- 我对创建GUI程序唯一的问题是,它不像控制台那样提供处理文本的所有可能性...考虑在WinForms应用程序中创建Matrix Rain几乎是不可能的,因为你无法在不使用GDI+的情况下将一段文本放在某个位置,然后你会遇到像持久性和闪烁等巨大的障碍...等等...总之,是的,GUI程序可以工作...大多数时候 😉