2012-01-13 111 views
3

我正在打开一个文本文件并删除第一行以准备它使用批量插入在数据库中导入。这里是我的代码:streamwriter不能正确保存unicode文件

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字符)在Value�中转换。

我该如何避免这种情况?

编辑:

记事本+ +设置为“编码的UTF-8” 这里是它的外观图片:

enter image description here

+0

你在打开什么文件?你确定它不是读回它的软件吗? – 2012-01-13 14:15:36

+0

@rudi_visser这不是一个显示错误,我试着用记事本,记事本++,也插入数据库时​​,它是相同的不正确的值。 – Iulian 2012-01-13 14:18:06

+0

记事本++正在以UTF8模式读取?对不起,只是试图确保,因为我最近使用几乎完全相同的方法将Unicode字符写入文件,并且它工作正常。 – 2012-01-13 14:19:51

回答

6

转化在Value�

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

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

+0

看起来我的文件没有用UTF-8编码。我从另一个应用程序接收此文件,它应该是UTF-8。Anoter为什么你永远不应该信任用户输入的例子。将编码设置为Default解决了我的问题。谢谢。 – Iulian 2012-01-16 10:38:57

4

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