2013-12-08 160 views
-5

我想知道如何最好地處理特殊字符,例如使用c#?處理特殊字符

e.g

public static string DecodeFrom64(string toDecode) 
{ 
    byte[] arrayToDecode = System.Convert.FromBase64String(toDecode); 
    return System.Text.Encoding.Unicode.GetString(arrayToDecode); 
} 
+1

你用它做什麼? – PCG

+0

來自db的描述(字符串)包含一些需要在前端進行讀取解碼的特殊字符。 – user2388013

+3

你還沒有解釋你對這些角色有什麼問題。你正在解碼的Base64字符串是如何生成的?你看到的輸出結果不符合你的期望? – Corey

回答

1

這裏的問題是,你已經存儲在UTF-8字符串到不同編碼數據庫中的 - 可能是Windows-1252代碼頁(CP2152)。結果,由字節序列E2 80 99表示的UTF-8字符被翻譯成CP2152單字節字符’。這一切都已解釋給你以前在this answer,這也解決了你目前的問題。

爲了回到原來的UTF-8編碼,你將需要採取的字符串從數據庫返回,用下面的代碼更正:

public static string UTF8From1252(string source) 
{ 
    // get original UTF-8 bytes from CP1252-encoded string 
    byte[] bytes = System.Text.Encoding.GetEncoding("windows-1252").GetBytes(source); 
    return System.Text.Encoding.UTF8.GetString(bytes); 
} 

這突出的事實,這是至關重要的使用在使用GetBytes方法時始終保持正確的編碼。

重要的是要注意,這種轉換的反向並不總是可能的,因爲CP2152代碼空間中存在間隙 - 在從字節值轉換期間將被丟棄或更改的值。

這些間隙的十六進制值爲:81 8D 8F 90 9D

不幸的是,這些值存在於各種UTF-8編碼中,例如E2 80 9D)。如果你的數據庫中有這些值中的一個,那麼它將無法正確加載。根據第一階段轉換的方式,數據庫中的第三個字節可能會丟失或損壞,在這種情況下,您無法檢索它。