在实际开发中,我们大家常常会遇到乱码这种情况。可能的原因有很多,但是可能我技术有限,之前常常疑惑于使用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编码方式也一定不出现乱码。如果要绝对保证不出现乱码情况,需确保编码与解码一致。
附:
希望此文能让同样存有困惑的兄弟能起到一定的帮助,也同样希望对此比较有研究的兄弟看到上面不正确之处能在评论中指处,谢谢大家。