我有一個UNICODE字符串(中文),我想將其轉換回MBCS,以便將其作爲參數添加到SQL查詢中。 (SQL Server中varchar中的列,所以這種轉換對我來說是必需的)。如何將UNICODE字符串轉換爲c#中的MBCS?
如何在c#中將MBCS轉換爲MBCS? 請幫忙。
感謝, Praseo
我有一個UNICODE字符串(中文),我想將其轉換回MBCS,以便將其作爲參數添加到SQL查詢中。 (SQL Server中varchar中的列,所以這種轉換對我來說是必需的)。如何將UNICODE字符串轉換爲c#中的MBCS?
如何在c#中將MBCS轉換爲MBCS? 請幫忙。
感謝, Praseo
我不知道是否要在此:
string result = Encoding.GetEncoding("gb2312").GetString(Encoding.Unicode.GetBytes(yourStr));
那麼你把一個字符串轉換成它的UTF-16表示,然後嘗試將它解碼爲一個gb2312字符串?這沒有任何意義。 – svick
「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語法)
試一試。面臨其他非varchar參數的問題。 SqlDataReader中的結果也被存儲在MBCS中,用於非varchar屬性。某處出錯了。 :( – praseo
感謝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
「MBCS」,如 「多字節字符集」?請原諒我,如果我缺少特定於SQL Server的內容,但UTF-8(假設「Unicode字符串」表示UTF-8)*是*(VL)MBCS。你想要將其轉換爲什麼其他MBCS? – deceze
你需要什麼MBCS?你需要什麼樣的表單?作爲'byte []'? SQL服務器不負責轉換嗎? – svick
我沒有想到SQL Server在varchar列中支持Unicode。 (你應該使用nvarchar,即使如此,它也是UCS-2。)varchar列使用了一個「代碼頁」,它取決於表的設置方式。基本上和Win32的「ANSI」和「Unicode」一樣,但是在數據庫域中。 – Thanatos