C#:bytes到UTF-8字符串转换。为什么不起作用?

时间:2013-03-04 16:32:49

标签: c# encoding utf-8 character-encoding hex

有一个中文字符,以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#中代替“”?

P.S。这个角色没什么特别之处:我对任何角色(2,3或4个字节长)都有相同的东西。

2 个答案:

答案 0 :(得分:12)

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

Console.OutputEncoding = System.Text.Encoding.Unicode

在写信之前。

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

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

答案 1 :(得分: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);
}