【问题标题】:streamwriter does not save unicode files correctlystreamwriter 无法正确保存 unicode 文件
【发布时间】:2012-02-09 17:35:30
【问题描述】:

我正在打开一个文本文件并删除第一行以准备使用批量插入将其导入数据库。这是我的代码:

string tempFile = Path.GetTempFileName();
using (var sr = new StreamReader("F:\\Upload\\File.txt", System.Text.Encoding.UTF8))
{
    using (var sw = new StreamWriter(tempFile,true, System.Text.Encoding.UTF8))
    {
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            if (line.Substring(0, 8) != "Nr. Crt.")
                sw.WriteLine(line);
        }
    }
}

System.IO.File.Delete("F:\\Upload\\File.txt");
System.IO.File.Move(tempFile, "F:\\Upload\\File.txt");

之后,如果我打开生成的文件,Unicode 字符会被其他字符替换。例如包含不间断空格(unicode U+00A0)的字符串:Value (注意 unicode char)被转换为 Value�

我怎样才能避免这种情况?

编辑:

Notepad++ 设置为“以 UTF-8 编码” 这是它的外观图片:

【问题讨论】:

  • 你用什么打开文件?你确定不是软件在回读吗?
  • @rudi_visser 这不是显示错误,我用记事本、notepad++ 试过,在插入数据库时​​也是同样的错误值。
  • 并且 Notepad++ 正在以 UTF8 模式读取?抱歉,只是想确定一下,因为我最近使用几乎完全相同的方法将 Unicode 字符写入文件,并且效果很好。
  • lulian 记事本、notepad++ 等仍然需要知道格式是什么...您尝试过包含 BOM 吗?
  • 是的,notepad++ 不是通灵的,这正是我在下面 Marc 的回答中所期望的。

标签: c# unicode streamwriter


【解决方案1】:

在我看来它写得很好,但你正在阅读的工具并不期待 UTF-8。在许多情况下,您需要明确告诉工具预期的编码。但是,一种常见的方法是预先添加 BOM(“字节顺序标记”)。这很简单——只需使用new UTF8Encoding(true) 作为编码,它就会自动发生。在期望 BOM 的工具中,这将在开始时显示为一些损坏的字符 - 但大多数现代工具会知道它的含义,并会自动切换到 UTF-8。关键是:UTF-8、UTF-16 LE 和 UTF-16 BE 等的 BOM 都略有不同,但可以识别。更完整的列表在 wikipedia

【讨论】:

    【解决方案2】:

    转化为 Value�

    这 3 个奇数字符的字节值为 0xef 0xbd 0xbf。这是代码点 \ufffd 的 utf8 编码,replacement character �读取 utf 编码文本且文本包含无效编码字节序列时使用。

    直指 File.txt 的一个问题,它可能不是以 utf-8 编码的。如果您不知道该文件使用了什么编码,那么第一个猜测是将 Encoding.Default 传递给 StreamReader 构造函数。

    【讨论】:

    • 看起来我的文件没有以 UTF-8 编码。我从另一个应用程序接收这个文件,它应该是 UTF-8。为什么你不应该相信用户输入的另一个例子。将编码设置为默认解决了我的问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2018-01-22
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    相关资源
    最近更新 更多