StreamReader 问题 - 未知文件编码 (western iso 88591)

Posted

技术标签:

【中文标题】StreamReader 问题 - 未知文件编码 (western iso 88591)【英文标题】:StreamReader problem - Unknown file encoding (western iso 88591) 【发布时间】:2010-09-27 02:44:53 【问题描述】:

从输入文件读取数据时,我注意到 ¥ 符号没有被 StreamReader 读取。 Mozilla Firefox 将输入文件类型显示为 Western (ISO-8859-1)。

在玩弄了编码参数后,我发现它成功地适用于以下值:

System.Text.Encoding.GetEncoding(1252) // (western iso 88591)

System.Text.Encoding.Default 

System.Text.Encoding.UTF7

现在我计划使用“默认”设置,但是我不确定这是否是正确的决定。现有代码没有使用任何编码,我担心我可能会破坏某些东西。

我对编码知之甚少(或者说一无所知)。我该怎么做?我决定使用 System.Text.Encoding.Default 安全吗?我应该要求用户以特定格式保存文件吗?

【问题讨论】:

【参考方案1】:

代码页 1252 与 ISO-Latin-1 不太一样。如果您想要 ISO-Latin-1,请使用 Encoding.GetEncoding(28591)。但是,我希望它们对于这个代码点 (U+00A5) 是相同的。 UTF-7 完全不同(而且几乎从来都不是您想要使用的)。

Encoding.Default安全的 - 在大多数情况下这是一个非常糟糕的主意。它特定于您正在运行的特定计算机。如果您将文件从一台计算机传输到另一台计算机,谁知道原始计算机使用的是什么编码?

如果您知道您的文件在 ISO-8859-1 中,请明确使用它。是什么产生了这些文件?如果他们只是被用户保存,他们被保存在什么程序中?如果 UTF-8 是一个选项,那是一个不错的选项 - 部分原因是它可以处理整个 Unicode。

我有一个article on Unicode 和另一个debugging Unicode issues,您可能会觉得有用。

【讨论】:

不幸的是,UTF-8 对我不起作用。阅读文章..“这是一个很大的话题。”并不是我所希望的开始 ;-) 当您尝试读取以 ISO-8859-1 编码的文件时,UTF-8 将不起作用,不。但是,如果您可以说服您的用户改为使用 UTF-8 保存,那将是一个胜利。【参考方案2】:

现有代码没有使用任何编码

它可能没有明确指定编码,在这种情况下,编码可能默认为 Encoding.UTF8。

名称 Encoding.Default 可能给人的印象是这是 StreamReader 等类使用的默认编码,但事实并非如此:正如 Jon Skeet 指出的那样,Encoding.Default 是操作系统当前 ANSI 的编码代码页。

我个人认为这使属性名称 Encoding.Default 有点误导。

【讨论】:

【参考方案3】:

您是软件开发人员吗?不要忘记阅读 Joel Spolsky 的 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

【讨论】:

不错!在潜艇上剥洋葱 6 个月!

以上是关于StreamReader 问题 - 未知文件编码 (western iso 88591)的主要内容,如果未能解决你的问题,请参考以下文章

c#streamreader 有的机器乱码有的不乱吗

TextReader 和StreamReader

StreamReader和StreamWriter说明

在 Adob​​e AIR 中读取未知编码的文本文件

StreamReader.ReadLine() 不消耗流

Python 读取文本文件编码错误解决方案(未知文本文件编码情况下解决方案)