【问题标题】:Default C# String encoding默认 C# 字符串编码
【发布时间】:2011-07-01 15:54:08
【问题描述】:

C# 中的默认字符串编码存在一些问题。我需要从某些文件/数据包中读取字符串。但是,这些字符串包含 128-256 范围内的字符(扩展 ascii),并且所有这些字符都显示为问号,而不是正确的字符。例如,当读取一个字符串时,它可能会显示为“S?meStr?n?”如果字符串包含扩展的 ascii 字符。

现在,有什么方法可以更改我的应用程序的默认编码?我知道在java中你可以从命令行定义默认字符集。

【问题讨论】:

  • 问题可能出在您的查看器中(网页、WPF 应用程序等)。你如何显示文本?可以发一些例子吗?
  • 我实际上已经发现了这个问题。我对 C# 的编码特性不太熟悉。我已经将我的数据包/文件读取类从 Encoding.ASCII 编辑为 Encoding.Default,实际上它现在似乎正在正确读取字符串(至少从数据包中)。
  • 不要使用 Encoding.Default - 它可以在机器之间更改,您的代码将无法正常工作(除了 Jon 和 Sean 的答案,请查看 joelonsoftware.com/articles/Unicode.html

标签: c# string


【解决方案1】:

没有一种单一的“扩展 ASCII”编码。有许多不同的 8 位编码与 ASCII 兼容,用于底部 128 个值。

您需要了解您的文件实际使用什么编码,并在使用StreamReader(或您正在使用的其他任何东西)读取数据时具体说明这一点。例如,您可能想要编码Windows-1252:

Encoding encoding = Encoding.GetEncoding(1252);

.NET 字符串是 always UTF-16 代码点序列。你无法改变这一点,你不应该尝试。 (在 Java 中也是如此,你真的不应该在调用 getBytes() 等时使用平台默认编码,除非这就是你真正的意思。)

【讨论】:

  • 我在阅读欧洲同行的文件时遇到过几次。解决方案是,“请告诉我你是如何编码文件的”,然后我可以在读取文件时使用正确的编码。通常,我最终将编码放在配置设置中,这样如果它们发生更改,我们仍然可以在不更改代码的情况下读取文件。
  • 你应该要求他们使用 UTF-8,除非他们能给出一个很好的理由为什么不能这样做。
  • 甚至不可能创建一个简单的 ASCII(0-127 个字符范围)字符串常量吗?我问这个是因为我用 TotalCommander 浏览了我编译的 C# 代码,我心想,把它变成一个 ASCII 字符串会很有趣。
  • @AdamL.S.:不清楚你的意思。您可以声明一个字符串常量:const string Foo = "XYZ"; - 这对任何字符串都适用。这个问题是关于编码的——不清楚你的评论与它有什么关系。
  • @AdamL.S.:好的 - 我实际上预计它会使用 UTF-8,但无论如何我肯定不会更改这方面的任何代码。
【解决方案2】:

Encoding 可以在至少一个读取文本的函数重载中指定 - 例如,ReadAllText(string, Encoding)

因此,如果您没有使用 Windows-1252 对文件进行编码,那么您可以像这样指定它:

string contents = File.ReadAllText(someFilePath, Encoding.GetEncoding(1252));

当然,这样做需要提前知道正在使用哪个代码页。

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 2011-07-08
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多