【问题标题】:Read txt files (in unicode and utf8) by means of C#通过 C# 读取 txt 文件(unicode 和 utf8)
【发布时间】:2013-09-23 04:13:03
【问题描述】:

我创建了两个内容相同的 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();
        }

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

【问题讨论】:

  • 记事本默认使用的编码是Encoding.Default。与您的选择不兼容。 Windows appcompat 具有传奇色彩,但确实妨碍了现代实践。不要犹豫,通过更改组合框中的编码选择来敲击记事本。或者使用编写 BOM 的更好的文本编辑器。

标签: c# unicode encoding utf-8


【解决方案1】:

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

string allText = File.ReadAllText(unicodeFileFullName, Encoding.UTF8);
Console.OutputEncoding = Encoding.UTF8;
Console.WriteLine(allText);

【讨论】:

  • 请不要在代码中使用幻数,将其提取为常量:P
  • 但是我将文件保存在 utf8 中(在记事本中看起来很正常),为什么我无法在 Encoding.UTF8 中读取它?
  • @oblomov - 您是否正在输出到控制台(然后显示???????)? (更新答案)
  • @keyboardP - 是的,到控制台。
  • @oblomov - 尝试设置控制台的OutputEncoding 属性,如上所示。
【解决方案2】:

在向控制台输出 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。

【讨论】:

  • Wiki 的文章简单地指出微软的软件是愚蠢的。它们使很多程序员认为 BOM 是 UTF8 的一部分——它不是。我不介意对此响应投反对票,因为我只是在抱怨我必须做的额外工作来解析文本文件,因为 MS 不遵循标准。您最好提供整篇文章的链接:en.wikipedia.org/wiki/UTF-8
【解决方案3】:

使用编码类型默认

File.ReadAllText(unicodeFileFullName, Encoding.Default);

它将修复 ???? 字符。

【讨论】:

  • 基本上它使用您当前的系统编码格式。并返回您可以在系统文本中看到的内容
  • 不同的服务器可以有不同的Encoding.Default所以不安全。
猜你喜欢
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 2020-08-10
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多