2016-05-13 14 views
0

我有一個C#程序,它從數據庫讀取數據並將其輸出到文本文件。從數據庫中讀取時的UTF-8編碼(C#)

OleDbCommand cmd = new OleDbCommand("SELECT * FROM " + tableName, conn); 
OleDbDataReader rdr = cmd.ExecuteReader(); 

if (rdr.HasRows) 
{ 
    while (rdr.Read()) 
    { 
     for (int i = 0; i < rdr.FieldCount; i++) 
     { 
      string toStr = rdr[i].ToString(); 

      // ...etc. 

其中一條線特別不斷給我帶來麻煩。這裏是什麼樣子的數據庫:

Signed 8-bit 2’s-compliment 

這裏是什麼樣子在我的輸出文件:

Signed 8-bit 2’s-compliment 

我想,我可以採取編碼考慮解決這個問題。所以我改變了我的代碼,將文本轉換爲UTF-8:

string toStr = Encoding.UTF8.GetString(Encoding.Default.GetBytes(rdr[i].ToString())); 

,這導致:

Signed 8-bit 2�s-compliment 

但是,如果我這樣做......

string toStr = Encoding.UTF8.GetString(Encoding.Default.GetBytes("Signed 8-bit 2’s-compliment")); 

..它完美地工作。

Signed 8-bit 2’s-compliment 

難道rdr[i].toString()是問題嗎?我的猜測是,當它將對象轉換爲字符串時,它將’字符的編碼擰緊,這使我無法將其正確轉換爲撇號。但我不認爲我可以避免在那裏使用toString()。那麼我該怎麼做?

回答

0

問題的根源在於數據庫的結尾。假設SQL Server,請看這個鏈接關於Collation and Unicode Support。基本上,您的數據可能不會以您想要的格式返回。

一般來說,SQL支持UTF-16,不支持UTF-8,所以只要數據正確返回,ToString()應該正確解碼,因爲.NET字符串格式爲UTF-16。此外,如果您不特別關心該特定字符,則可以更新數據庫記錄併爲該行文本設置一個「正常」撇號。