2009-08-13 79 views
2

在C#中,我正在讀取從文本文件插入SQL語句,然後嘗試使用ADO.NET在數據庫上執行它們。其中一些查詢中包含希臘字符。具體來說,Mu(看起來很時髦)用於微秒(usec)。問題在於問號實際上被插入到數據庫中(?sec)。但是,我感覺問題在於讀取文本文件,因爲調試器也在鑽石內部顯示問號。我正在使用StreamReader的ReadLine方法。我究竟做錯了什麼?如何從文件中讀取特殊字符?

回答

4

問題幾乎可以肯定的是,當你讀取文件時,你使用了錯誤的編碼。你知道什麼編碼你的文本文件實際上是在?大多數.NET API默認使用UTF-8,但您的文件可能在處於操作系統的默認編碼中,該編碼由Encoding.Default表示。試試這個:

using (StreamReader reader = new StreamReader(filename, Encoding.Default)) 
{ 
    ... 
} 

我也強烈建議您嘗試得到它的工作而不觸及數據庫。閱讀文件中,然後打印出字符串中的字符在他們的Unicode編碼方面:

public static void DumpString(string text) 
{ 
    Console.WriteLine("Text: '{0}'", text); 
    foreach (char c in text) 
    { 
     Console.WriteLine("{0}: U+{1:x4}", c, (int) c); 
    } 
} 

如果給出正確的結果,然後嘗試將其插入到數據庫中。這樣,如果數據庫之後看起來「錯誤」,那麼您知道問題出在您的數據庫訪問上,而不是文件訪問上。

+0

這似乎是伎倆。但是,我不確定我是否理解這整個編碼的事情。如果另一個具有不同默認編碼的用戶修改了該文件,然後我嘗試用新文件重新運行我的應用程序,該怎麼辦?它會不再起作用嗎?我應該使用Encoding.UTF8嗎? – bsh152s 2009-08-13 21:34:42

+0

使用UTF-8是一個更好的主意,是的 - 但你需要確保你始終知道編碼的真正含義。你能確保文件將*永遠*保存爲UTF-8? – 2009-08-13 22:33:25

2

您需要檢查三兩件事:

  1. 當你打開的StreamReader
  2. 在數據庫服務器上的列類型(nvarchar的,而不是爲varchar)
  3. 在該效果的歸類中使用的編碼列

如果其中任何一個都是錯誤的,當您從數據庫讀取數據時會得到錯誤的值。

相關問題