"上海"是如何變成"涓婃搗"的?
Posted on 2011-03-29 23:50 laogao 閱讀(2697) 評論(0) 編輯 收藏 所屬分類: Computer Usage 、On Java今天幫同事解決一個郵件亂碼的問題,簡記于此。
郵件正文就不貼了,有一段從上下文判斷明顯應該是"上海",卻顯示成了"涓...",于是自然而然的拿出"上"字和"涓"字來分析。
通過簡單的Groovy腳本對這兩個漢字分別按gbk和utf-8編碼,并將得到的byte[]轉換成二進制表示輸出如下:
== 上 ==
11001001 11001111
11100100 10111000 10001010
== 涓 ==
11100100 10111000
11100110 10110110 10010011
注意"上"字的第2排前兩組和"涓"字第1排的兩組byte正好相同,于是問題迎刃而解,亂碼是由于郵件以utf-8編碼后被錯誤的以gbk解碼(隨后又重新編碼成utf-8)造成的。
關鍵代碼:
void showBytes(String input) {
println("== " + input + " ==")
b = input.getBytes("gbk")
b.each { print Integer.toBinaryString(it).substring(24) + ' ' }
println()
b = input.getBytes("utf8")
b.each { print Integer.toBinaryString(it).substring(24) + ' ' }
println()
}