2011-10-17 44 views
0

我有一個UNICODE字符串(中文),我想將其轉換回MBCS,以便將其作爲參數添加到SQL查詢中。 (SQL Server中varchar中的列,所以這種轉換對我來說是必需的)。如何將UNICODE字符串轉換爲c#中的MBCS?

如何在c#中將MBCS轉換爲MBCS? 請幫忙。

感謝, Praseo

+0

「MBCS」,如 「多字節字符集」?請原諒我,如果我缺少特定於SQL Server的內容,但UTF-8(假設「Unicode字符串」表示UTF-8)*是*(VL)MBCS。你想要將其轉換爲什麼其他MBCS? – deceze

+1

你需要什麼MBCS?你需要什麼樣的表單?作爲'byte []'? SQL服務器不負責轉換嗎? – svick

+1

我沒有想到SQL Server在varchar列中支持Unicode。 (你應該使用nvarchar,即使如此,它也是UCS-2。)varchar列使用了一個「代碼頁」,它取決於表的設置方式。基本上和Win32的「ANSI」和「Unicode」一樣,但是在數據庫域中。 – Thanatos

回答

-1

我不知道是否要在此:

string result = Encoding.GetEncoding("gb2312").GetString(Encoding.Unicode.GetBytes(yourStr)); 
+0

那麼你把一個字符串轉換成它的UTF-16表示,然後嘗試將它解碼爲一個gb2312字符串?這沒有任何意義。 – svick

1

「MBCS」可能是一個數字編碼。對於中國的語言環境,這將是code page 936,一個GB-變的,你可以使用編碼其字節:

byte[] bytes= Encoding.GetEncoding(936).GetBytes("你好") 
=> 
{196, 227, 186, 195} 

如果你不是專門談論GB編碼和想要的多字節編碼是默認你當前的系統,那麼你可以只使用默認(「ANSI」)編碼,這將是MBCS編碼:

byte[] bytes= Encoding.Default.GetBytes("你好") 
=> 
{196, 227, 186, 195} // on a system in the China locale (cp936) 
{167, 65, 166, 110} // on a system in the HK locale (cp950) 

現在,讓你的字節數組到查詢你必須要麼:

1)最好使用帶有基於字節的SqlDbT的參數YPE,例如:

command.Parameters.AddWithValue("@greeting", bytes); 

2)ORIF你必須將其直接插入查詢串,編碼字節爲十六進制文字,例如:

"0x"+BitConverter.ToString(bytes).Replace("-", "") 
=> 
... WHERE greeting=0xC4E3BAC3 ... 

(這是非ANSI標準SQL Server語法)

+0

試一試。面臨其他非varchar參數的問題。 SqlDataReader中的結果也被存儲在MBCS中,用於非varchar屬性。某處出錯了。 :( – praseo

0

感謝bobince的提示。 雖然我無法參數化我的查詢執行。

最後,我的一位高級同事幫了忙。 :) 這是將Unicode編碼的字符串轉換爲由多字節字符(MBCS)組成的字符串的另一種解決方案,用於在T-SQL中與傳統數據庫中的varchar列進行比較。

我們可以使用SqlString類的GetNonUnicodeBytes()方法。

這是下面的代碼片段。

 string inputUnicodeString = "你好"; 
     SqlString mySqlString = new SqlString(inputUnicodeString); 
     byte[] mbcsBytes = mySqlString.GetNonUnicodeBytes(); 
     string outputMbcsString = string.Empty; 
     for (int index = 0; index < mbcsBytes.Length; index++) 
     { 
      outputMbcsString += Convert.ToChar(mbcsBytes[index]); 
     } 

這幫助我在UNICODE中比較所需的varchar數據庫列和用戶請求的字符串。 希望此回覆有助於他人。

問候,

Praseo

相關問題