如何使控制台能够打印任何65535 UNICODE字符

时间:2012-10-04 07:02:02

标签: c# unicode

我正在尝试使用unicode字符并从Wikipedia

中获取unicode值

我的问题是我的控制台显示所有 C0控制和基本拉丁 unicode字符,即从U + 0000到U + 00FF但是对于所有其他类别,如 Latin Extended -B,Cyrillic,其他语言等,控制台打印问号字符()。

我的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("the unicode character is  value" + ch);

        }
    }
}

我正在使用Windows 7,Visual Studio 2010.我该怎么做才能增加Unicode支持。

1 个答案:

答案 0 :(得分:20)

这个问题背后有很多历史,我会先讨论一下这个问题。控制台模式应用程序只能使用8位文本编码。这可以追溯到42年前Ken Thompson等人设计Unix时做出的设计决策。 Unix的核心功能是终端I / O通过管道完成,您可以将管道链接在一起,将一个程序的输出提供给另一个程序的输入。此功能也在Windows中实现,并且受.NET以及ProcessStartInfo.RedirectStandardXxxx属性的支持。

很棒的功能但是当操作系统开始采用Unicode时,这成了一个问题。 Windows NT是第一个完全采用Unicode的核心。必须始终对Unicode字符进行编码,当时常见的选择是UCS,后来变为utf-16。现在I / O重定向存在问题,当重定向到仍使用8位编码字符的程序时,一个吐出16位编码字符的程序将无法正常运行。

感谢Ken Thompson以及为这个问题寻找解决方案,他发明了utf-8编码。

这也适用于Windows。在控制台模式应用程序中很容易,您必须重新分配Console.OutputEncoding属性:

using System;
using System.Text;

class Program {
    static void Main(string[] args) {
        Console.OutputEncoding = Encoding.UTF8;
        Console.WriteLine("Ĥėļŀō ŵŏŗłđ");
        Console.ReadLine();
    }
}

然而,您现在遇到另一个问题,为控制台窗口选择的字体很可能无法呈现文本。按Alt + Space可调用系统菜单,属性,字体选项卡。您需要选择非光栅字体。 Pickings非常纤薄,在Vista上你可以选择Consolas。重新运行您的程序,重音字符应正确呈现。不幸的是,以编程方式强制控制台字体是一个问题,您需要记录此配置步骤。此外,像Consolas这样的字体没有完整的可能Unicode字形集。您可能会看到没有字形的Unicode代码点出现矩形。一个不起眼的提醒,创建一个GUI程序真的是你最好的选择。