【问题标题】:How does Encoding.Default work in .NET?Encoding.Default 如何在 .NET 中工作?
【发布时间】:2011-08-25 18:32:40
【问题描述】:

我正在使用以下方式读取文件:

var source = File.ReadAllText(path);

并且字符© 未正确加载。

然后,我改成:

var source = File.ReadAllText(path, Encoding.UTF8);

什么都没有。

我决定尝试使用

var source = File.ReadAllText(path, Encoding.Default);

而且效果很好。 然后我调试了一下,想找哪个Encoding成功了,发现是UTF-7

我想知道的是:

是否推荐使用Encoding.Default,能保证文件的所有字符都能正常读取吗?

【问题讨论】:

  • 我觉得有趣的是 Encoding.Default 会产生 UTF7 而不是扩展的 ascii 编码之一,例如 Windows-1251 或 Windows-1252。谁能赐教?

标签: c# file file-io encoding io


【解决方案1】:

Encoding.Default 只会保证所有 UTF-7 字符集都能被正确读取(google for the whole set)。另一方面,如果您尝试在 UTF-8 模式下读取未使用 UTF-8 编码的文件,则会像您一样得到损坏的字符。

例如,如果文件是 UTF-16 编码的,并且您以 UTF-16 模式读取它,那么即使该文件不包含单个 UTF-16 特定字符,您也可以。这一切都归结为文件的编码。

您需要进行保存 - 重新打开具有相同编码的内容以防止损坏。否则,请尽可能多地使用 UTF-7,因为它是可能的最紧凑但“电子邮件安全”的编码,这也是大多数 .NET 框架设置中默认使用它的原因。

【讨论】:

  • 但是如果文件使用UTF-16 代替呢?所有编码都会发生同样的情况吗?
  • 如果它是 UTF-16,你唯一的机会就是以 UTF-16 模式打开它,但我确信它会通过去除非 utf- 来向下转换为 UTF-8 8 个兼容字符。
  • @TeomanSoygul 没有“非 utf-8 兼容字符”之类的东西;任何字符都可以用 UTF8 或 UTF16 编码,而在您使用“字符”时,文本已经被解码了。至于字节,你不能简单地确定它;它们都遵循特定的位模式。最后,为了转换它们,您只需将它们解码为一个,然后编码为另一个。
【解决方案2】:

不推荐使用Encoding.Default。

引用MSDN:

不同的电脑可以使用不同的 编码作为默认值,并且 默认编码甚至可以改变 单台电脑。因此,数据 从一台计算机流式传输到另一台计算机 甚至在不同时间检索 在同一台计算机上可能 翻译错误。此外, 默认返回的编码 属性使用最适合的后备映射 不支持的字符到字符 由代码页支持。对于这些 两个原因,使用默认 一般不推荐编码。 确保编码的字节是 正确解码,您的应用程序 应该使用 Unicode 编码,例如 UTF8Encoding 或 UnicodeEncoding,与 序言。另一种选择是使用 更高级别的协议,以确保 相同的格式用于编码 和解码。

【讨论】:

  • 您是否尝试过从 .NET 生成带有 Unicode 前导码的文件?它涉及将字节数组与前导码和数据连接起来。如果你想编写 UTF7 文件,你必须生成自己的前导码,因为 UTF7Encoding 没有实现 GetPreamble() - 它回退到 Encoding.GetPreamble() ,它返回一个空数组!
  • UTF7 的序言是一团糟;它以某种方式包括第一个字符的前 2 位。我什至不知道如何开始解码...
【解决方案3】:

听起来您对自动检测文件的编码感兴趣,在某种情况下您无法控制用于保存文件的编码。 StackOverflow 上有几个问题可以解决这个问题;一些粗略的浏览指向Determine a string's encoding in C# 是一个相当不错的。我最喜欢的答案是the one pointing to a C# port of Mozilla's universal charset detector

【讨论】:

    【解决方案4】:

    我认为你的文件是 utf-7 编码。仅此而已。 访问此页面Your Answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2012-12-27
      相关资源
      最近更新 更多