【问题标题】:File encoding doesn't work文件编码不起作用
【发布时间】:2014-05-23 20:17:50
【问题描述】:

在我的代码中

string[] Lines = reactor.GetMergedLines();
string fileName = "foo.bar";
StreamWriter sw = new StreamWriter(File.Open(fileName, FileMode.CreateNew), Encoding.GetEncoding(28605));
foreach (string line in Lines)
{
    sw.WriteLine(line);
}
sw.Close();

创建的文件未使用给定的代码页进行编码。行由 iso-8859-1 文件中的字符串填充。我使用代码页号Encoding.GetEncoding(28605) 进行了尝试,它的名称为Encoding.GetEncoding("ISO-8859-15") 并使用File.WriteAllLines(fileName, Lines, Encoding.GetEncoding(28605)) 而不是StreamWriter。但是,如果我用 cygwin file -bi [filename] 查看文件,它会告诉我,编码将是“us-ascii”。此外,某些字符未正确编码并被问号替换。

How to write out a text file in C# with a code page other than utf-8? 没有帮助,如您所见。

有什么问题?

【问题讨论】:

  • some characters aren't encoded properly and replaced by question marks 你怎么知道的?您用来查看文件的工具是否能够设置所需的代码页? file 无法猜测文件是 ISO-8859-15 编码的,没有元数据。您需要使用 ISO-8859-15 解码读取文件才能判断是否正确保存。
  • 我用notepad++试了一下,把编码设置为ISO-8859-15。也与其他文本查看器一起使用。还是问号。这些不是编码未知字符的标准字符。
  • 您保存的文本是有效的 ISO-8859-15 文本吗?
  • @RemusRusanu 你这是什么意思?怎么会无效?
  • ISO-8859-15 是“8 位单字节编码图形字符集”。它可以编码的字符集是有限的,大约有 255 个。你的 C#string 是 Unicode,有数万个有效的code points。显然,并非所有 C# 字符串值都具有等效的有效单字节代码页。

标签: c# file encoding streamwriter


【解决方案1】:

您可以使用 Encoding.GetEncoding 的其他重载来处理无法将 Unicode 字符转换为目标代码页的所有情况。有关此MSDN topic 的更多信息。 如果您明确设置 Encoding.EncoderFallback 属性 (link to MSDN),也可以实现同样的效果。

例如,每次转换一个 Unicode 字符失败时,您可以使用以下方法抛出异常:

Encoding enc = Encoding.GetEncoding(28605, EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback);

注意:默认的EncoderFallbackSystem.Text.InternalEncoderBestFitFallback,它会为未知代码点生成问号。

【讨论】:

  • 感谢您的回答。它有助于解决我的问题。但我得到的错误信息实际上更令人困惑。我逐行写入文件,并在大约 10 个字符的特定行出现异常。但消息是,索引 262 处出现错误。怎么会这样?
  • 抱歉耽搁了。 StreamWriter 的实际写入是缓冲的,因此您看到的索引在此缓冲区内。您可以使用另一个构造函数重载来控制缓冲区大小。您还可以使用布尔属性AutoFlush 控制刷新模式。这意味着只有当缓冲区已满 (false) 或调用任何重写的 Write 方法 (true) 时,此 StreamWriter 实际上才会写入其数据。默认值为false,但无论如何,当StreamWriter 将被释放时,缓冲区也会被刷新,而当它被GC 最终确定时不会
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多