在實際開發中,我們大家常常會遇到亂碼這種情況。可能的原因有很多,但是可能我技術有限,之前常常疑惑於使用utf-8儲存中文為何亂碼了?有時候也疑惑於使用Gbk寫入到頁面也出現亂碼了,事情發生距離現在已經很久了,具體問題已經無處考證,但是一直是心中的疑惑。今天做一個簡訊郵件的Timer,同事反映把發送的郵件放入到Outlook的垃圾箱會出現亂碼的情況,閑於無聊,心中的想法是先把亂碼的字元還原玩玩。
首先我在網上找到了一個兄弟還原亂碼的代碼,在此貼出希望那個兄弟別見怪。
string utfinfo = "瑁村濺 / 姹熻嫃鐪佸疁鍏村競楂樺鍖楀伐涓氬尯 姹熻嫃絏炴床鐜宸ョ▼鏈夐檺鍏徃 / 鍖栧鍝佽繃鏁忓瑁咃紙涓害錛?";//這個是錯誤的編碼、來源於 utf-8 post gb2312頁面提取時候的錯誤編碼、這個時候如果你的資料已經記錄、又沒有原來的資料、你怎麼辦? 就需要將這個錯誤的編碼通過同樣的方法還原。下面是具體實施步驟! string gb2312info = string.Empty; Encoding utf8 = Encoding.UTF8; Encoding gb2312 = Encoding.GetEncoding("gb2312"); byte[] unicodeBytes = gb2312.GetBytes(utfinfo);//這裡是因為我是utf-8 post 到 gb2312頁面出現錯誤編碼、這個根據你的情況來定。 byte[] asciiBytes = Encoding.Convert(utf8, gb2312, unicodeBytes); char[] asciiChars = new char[gb2312.GetCharCount(asciiBytes, 0, asciiBytes.Length)]; gb2312.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0); gb2312info = new string(asciiChars); Response.Write(gb2312info);
我測試了下,發現這段代碼是可行的。但是從中,我又存有疑惑。
疑惑1、Encoding.Convert(utf8, gb2312, unicodeBytes) 這個方法中 源編碼方式應該為gb2312 才對,為何是utf-8?
疑惑2、Encoding.Convert(utf8, gb2312, unicodeBytes) 這個方法中 目標編碼方式應該為utf-8 才對,為何寫的是gb2312呢?
因為疑惑,我試著把 Encoding.Convert(utf8, gb2312, unicodeBytes) 中的utf8與gb2312交換做下測試,測試結果為依然亂碼。
我想是否是我的想法有問題呢?我嘗試把思路從理一遍。
string(utf-8) 發送->二進位->string(gbk) 解析
按照如上的思路我試著把代碼做下改動。代碼如下:
string utfinfo = "瑁村濺 / 姹熻嫃鐪佸疁鍏村競楂樺鍖楀伐涓氬尯 姹熻嫃絏炴床鐜宸ョ▼鏈夐檺鍏徃 / 鍖栧鍝佽繃鏁忓瑁咃紙涓害錛?";//這個是錯誤的編碼、來源於 utf-8 post gb2312頁面提取時候的錯誤編碼、這個時候如果你的資料已經記錄、又沒有原來的資料、你怎麼辦? 就需要將這個錯誤的編碼通過同樣的方法還原。下面是具體實施步驟! string gb2312info = string.Empty; Encoding utf8 = Encoding.UTF8; Encoding gb2312 = Encoding.GetEncoding("gb2312"); byte[] unicodeBytes = gb2312.GetBytes(utfinfo);//這裡是因為我是utf-8 post 到 gb2312頁面出現錯誤編碼、這個根據你的情況來定。 Console.WriteLine(utf8.GetString(unicodeBytes));
測試結果與上面一致:
結論:
不存在gbk編碼的中文資料一定不出現亂碼,也不一定使用utf-8編碼方式也一定不出現亂碼。如果要絕對保證不出現亂碼情況,需確保編碼與解碼一致。
附:
希望此文能讓同樣存有困惑的兄弟能起到一定的協助,也同樣希望對此比較有研究的兄弟看到上面不正確之處能在評論中指處,謝謝大家。