streamwriter无法正确保存unicode文件

时间:2012-01-13 14:13:37

标签: c# unicode streamwriter

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

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编码' 以下是它的外观图片:

enter image description here

2 个答案:

答案 0 :(得分:6)

  

转换为Value�

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

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

答案 1 :(得分:4)

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