19

我创建了两个内容相同的 txt 文件(Windows 记事本)“谢谢 - спасибо”,并将它们保存为 utf8 和 unicode。在记事本中,它们看起来不错。然后我尝试使用 .Net 阅读它们:

...File.ReadAllText(utf8FileFullName, Encoding.UTF8);

...File.ReadAllText(unicodeFileFullName, Encoding.Unicode);

但在这两种情况下,我都得到了这个“谢谢 - ???????”。怎么了?

更新:utf8的代码

static void Main(string[] args)
        {
            var encoding = Encoding.UTF8;
            var file = new FileInfo(@"D:\encodes\enc.txt");
            Console.OutputEncoding = encoding;
            var content = File.ReadAllText(file.FullName, encoding);
            Console.WriteLine("encoding: " + encoding);
            Console.WriteLine("content: " + content);
            Console.ReadLine();
        }

结果: 谢谢 ÑпаÑибо

4

3 回答 3

17

编辑为UTF8应该支持字符。您似乎正在输出到尚未设置编码的控制台或位置。如果是这样,您需要设置编码。对于控制台,您可以这样做

string allText = File.ReadAllText(unicodeFileFullName, Encoding.UTF8);
Console.OutputEncoding = Encoding.UTF8;
Console.WriteLine(allText);
于 2013-09-18T11:59:07.723 回答
6

使用编码类型默认

File.ReadAllText(unicodeFileFullName, Encoding.Default);

它将修复????Chracters。

于 2016-07-18T05:10:43.347 回答
3

将 Unicode 或 UTF-8 编码的多字节字符输出到控制台时,您需要设置编码并确保控制台具有支持多字节字符的字体集,以便显示相应的字形。使用现有代码,MessageBox.Show(content) 或 Windows 或 Web 窗体上的显示将正确显示。

查看http://msdn.microsoft.com/en-us/library/system.console.aspx以了解有关在控制台窗口中设置字体的说明。

"对 Unicode 字符的支持要求编码器识别特定的 Unicode 字符,并且还需要具有呈现该字符所需字形的字体。要成功将 Unicode 字符显示到控制台,必须将控制台字体设置为非光栅或 TrueType 字体,例如 Consolas 或 Lucida Console。”

附带说明一下,您可以使用 FileStream 类读取文件的前三个字节,并在读取文件时查找字节顺序标记指示符以自动设置编码。例如,如果 byte[0] == 0xEF && byte[1] == 0xBB && byte[2] == 0xBF 那么你有一个 UTF-8 编码的文件。有关详细信息,请参阅http://en.wikipedia.org/wiki/Byte_order_mark

于 2013-09-18T14:19:02.557 回答