字符编码问题
来源:互联网 发布:c语言网上培训班 编辑:程序博客网 时间:2024/06/03 22:39
http://www.dotblogs.com.tw/yc421206/archive/2011/06/09/27596.aspx
是我在某天所遇到的一個問題,我對某台設備進行操作時它回傳了一串我看不懂的字串
³nÅé¼Ò²Õ¤¤ªº¤@¯ë©Ê¿ù»~¡G¼Ð·Ç GUI (¹Ï§Î¤Æ¥Î¤á¤¶±)¡C";
當時直覺就是使用編碼來處理,不過這樣做並不會得到正確的結果,原因是我並未取得正確的編碼byte,也就是codepage
byte[] big5 =Encoding.GetEncoding("Big5").GetBytes("³nÅé¼Ò²Õ¤¤ªº¤@¯ë©Ê¿ù»~¡G¼Ð·Ç GUI (¹Ï§Î¤Æ¥Î¤á¤¶±)¡C");Console.WriteLine(Encoding.GetEncoding("Big5").GetString(big5));
插撥一下,稍微講解一下Encoding.GetEncoding的用法,Encoding.GetEncoding的第一個參數叫codepage,什麼叫codepage(字碼頁)
字碼頁。
微軟賦予每個語言一個數字代碼,叫做字碼頁(codepage)。字碼頁可能會決定使用哪些文字,以及單位符號等等。
繁體中文的字碼頁是 950。
我們可以由Encoding.GetEncodings方法 加上 Encoding.CodePage 屬性 取得所有的codepage
static void codepage(){ foreach (EncodingInfo ei in Encoding.GetEncodings()) { Encoding e = ei.GetEncoding(); Console.WriteLine("Name:{0},CodePage:{1}",ei.Name, e.CodePage); } Console.ReadLine();}
也可以查一下google
http://www.lingoes.net/en/translator/codepage.htm
接下來回到正題,該怎麼樣處理那該死的亂碼?只要用以下的原始碼就能夠處理。
static void encoding(){ string source = "³nÅé¼Ò²Õ¤¤ªº¤@¯ë©Ê¿ù»~¡G¼Ð·Ç GUI (¹Ï§Î¤Æ¥Î¤á¤¶±)¡C"; byte[] unknow = Encoding.GetEncoding(28591).GetBytes(source); string Big5 = Encoding.GetEncoding(950).GetString(unknow); Console.WriteLine(Big5); Console.ReadLine();}
先把字串轉成正確的byte
byte[] unknow = Encoding.GetEncoding(28591).GetBytes(source);
再把轉到你想要顯示的編碼
string Big5 = Encoding.GetEncoding(950).GetString(unknow);
果真翻譯成我們要看的編碼了~
好了問題來了,怎麼知道編碼是28591,我們可以用下列片斷程式碼來處理,會得到所有codepage交叉處理的結果,觀察文字檔有哪些是看的懂的文字,會得到不少的正確。
static void savecode(){ StringBuilder sb = new StringBuilder(); string source = "³nÅé¼Ò²Õ¤¤ªº¤@¯ë©Ê¿ù»~¡G¼Ð·Ç GUI (¹Ï§Î¤Æ¥Î¤á¤¶±)¡C"; foreach (var e1 in Encoding.GetEncodings()) { foreach (var e2 in Encoding.GetEncodings()) { byte[] unknow = Encoding.GetEncoding(e1.CodePage).GetBytes(source); string result = Encoding.GetEncoding(e2.CodePage).GetString(unknow); sb.AppendLine(string.Format("{0} => {1} : {2}",e1.CodePage,e2.CodePage,result)); } } File.WriteAllText("test.txt", sb.ToString());}
內容有1.8Mbyte實在很多,這次只要用950跟所有的codepage交叉比對,資料量立即下降許多
static void savebig5(){ StringBuilder sb = new StringBuilder(); string source = "³nÅé¼Ò²Õ¤¤ªº¤@¯ë©Ê¿ù»~¡G¼Ð·Ç GUI (¹Ï§Î¤Æ¥Î¤á¤¶±)¡C"; foreach (var e in Encoding.GetEncodings()) { byte[] unknow = Encoding.GetEncoding(e.CodePage).GetBytes(source); string result = Encoding.GetEncoding(950).GetString(unknow); sb.AppendLine(string.Format("{0} => {1} : {2}", e.CodePage, 950, result)); } File.WriteAllText("big5.txt", sb.ToString());}
後記:
此篇參考http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/d9879f8b-ab96-466e-a7bd-94167c52d0d1
也感謝所有參與回覆的伙伴。
若有謬誤,煩請告知,新手發帖請多包涵
- Java 字符编码问题
- Java 字符编码问题
- 字符编码问题
- 关于字符编码问题
- 字符编码问题摘要
- MySQL字符编码问题
- 关于字符编码问题
- 字符编码问题
- 字符编码问题
- 字符编码问题
- 字符编码问题
- 字符编码问题总结
- JavaFX 字符编码问题
- 字符的编码问题
- 字符的编码问题
- 关于字符编码问题
- 字符编码问题
- redis字符编码问题
- 如何格式化JSON时间对象
- 工具类:日期处理
- error LNK2001: unresolved external symbol "char * __stdcall _com_util::ConvertBSTRToString(wchar_t
- NYOJ-333 mdd的烦恼【欧拉函数】
- hibernate处理批量更新和批量删除
- 字符编码问题
- 一个进程 fork 多个子进程
- C语言常见知识点
- android.view.WindowManager$BadTokenException这个异常的一种情况
- MongoDB 学习手册
- protobuf和thrift对比
- 腹肌——健康的风向标
- 初识Hadoop
- SpagoBI 报表功能 - SpagoBIJasperReportEngine