5

有一个汉字在 UTF-8 中显示为 F0 A4 AD A2。这个字符在这里描述:http ://en.wikipedia.org/wiki/UTF-8

U+24B62 F0 A4 AD A2

当我在C#中运行此代码时...

byte[] data = { 0xF0, 0xA4, 0xAD, 0xA2 };
string abc = Encoding.UTF8.GetString(data);
Console.WriteLine("Test: description = {0}", abc);

...我将输出重定向到文本文件,然后使用 notepad.exe 选择 UTF-8 编码打开它。我希望得到输出,但确实得到两个问号 (??)。

字节序列是正确的。它在 Perl 中工作:

print "\xF0\xA4\xAD\xA2";

在输出中,我得到

所以我的问题是:为什么我会得到“??” 而不是C#中的“” ?

PS 这个字符没什么特别的:我对任何字符(2、3 或 4 字节长)都得到了相同的东西。

4

2 回答 2

12

默认情况下,控制台无法显示 Unicode 字符。它只显示 ASCII。要使其显示 Unicode,请使用:

Console.OutputEncoding = System.Text.Encoding.Unicode

在给它写信之前。

无论如何它在大多数操作系统上都会失败,因为 Windows 命令行本身不支持 Unicode。

因此,出于测试目的,最好将输出写入文件

于 2013-03-04T16:40:21.643 回答
4

您需要使用 UTF8 写入文件。下面的代码显示了您可以如何做到这一点。在记事本中打开生成的文件时,字符显示正确:

string c = "";
var bytes = Encoding.UTF8.GetBytes(c);
var cBack = Encoding.UTF8.GetString(bytes);
using (var writer = new StreamWriter(@"c:\temp\char.txt", false, Encoding.UTF8))
{
    writer.WriteLine(cBack);
}
于 2013-03-04T16:46:48.480 回答