14

我正在尝试使用 unicode 字符并从Wikipedia页面获取 unicode 值

我的问题是我的控制台显示所有C0 控件和基本拉丁unicode 字符,即从 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("the unicode character is  value" + ch);

        }
    }
}

我正在使用 Windows 7、Visual Studio 2010。我应该怎么做才能增加对 Unicode 的支持。

4

1 回答 1

21

这个问题背后有很多历史,我会先讨论一下。控制台模式应用程序只能使用 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 调用系统菜单、属性、字体选项卡。您需要选择一种非光栅字体。采摘非常苗条,在 Vista 及以上您可以选择 Consolas。重新运行您的程序,重音字符应该会正确呈现。不幸的是,以编程方式强制使用控制台字体是一个问题,您需要记录此配置步骤。此外,像 Consolas 这样的字体没有完整的可能的 Unicode 字形集。您可能会看到没有字形的 Unicode 代码点出现矩形。这一切都在提醒你,创建一个 GUI 程序确实是你最好的选择。

于 2012-10-06T14:39:07.213 回答