2012-01-13 112 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