Can Encoding.Default能识别utf8字符吗?我真的不应该使用它吗?

时间:2017-03-06 18:36:48

标签: c# .net vb.net encoding character-encoding

好吧,当使用IO.File.ReadAllText(path)ReadAllText(path, System.Text.Encoding.UTF8)读取以ANSI编码保存的文本文件时,非拉丁字符无法正确显示。

所以,我决定使用Encoding.Default。它运行得很好,但我看到建议不要在任何地方使用它(例如herehere),因为它"只能保证所有UTF-7字符集都能正确读取& #34; 。也是微软 表示:

  

获取操作系统当前ANSI代码页的编码。

但是,在我看来,它可以识别任何编码的文件。我在a file that contains Chinese, Japanese, and Arabic characters - 上测试了该文件以utf8编码保存 - ,我能够正确显示文件。

使用的代码:

Dim loadedText As String = IO.File.ReadAllText(path, System.Text.Encoding.Default)
MessageBox.Show(loadedText, "utf8")

输出:

output

所以我的问题是:

  • 我在这里找不到什么东西?
  • 为什么不建议在阅读文件时使用Encoding.Default ? 我知道如果更改了默认的系统编码/系统区域设置,那么使用ANSI编码的文件将显示不正确,这在我目前的情况下是我不关心的。 ..
  • 还有其他方法可以防止这种情况发生吗?

附注:请不要介意我使用c#标记。虽然我的代码是在VB中,但欢迎任何使用C#代码的答案。

2 个答案:

答案 0 :(得分:2)

File.ReadAllText实际上会尝试自动检测编码。如果无法从BOM确定编码,则使用encoding参数对文件进行解码。

  

此方法尝试根据字节顺序标记的存在自动检测文件的编码。可以检测到编码格式UTF-8和UTF-32(big-endian和little-endian)。

如果您使用Encoding.UTF8来编写文件,那么它将包含BOM。您的Encoding.Default可能会被忽略。

答案 1 :(得分:0)

建议不要使用{{1}},因为它是操作系统的ANSI代码页,仅限于给定代码页的字符集。换句话说,在捷克语Windows中的记事本(ANSI编码)中创建的文本文件将在英语Windows中显示不正确。因此,应该以UTF-8编码保存和打开所有内容。

  • 以ANSI格式保存并以Unicode格式打开可能无法正常工作
  • 以Unicode格式保存并以ANSI格式打开
  • 以ANSI保存并在另一个ANSI中打开可能无法正常工作