轉載請註明出處:http://blog.csdn.net/itjianghuxiaoxiong/article/details/38821423
最近用wireshark抓包分析接口時,遇到無法將返回Json或Xml中的漢字有效顯示的問題,分析發現在數據包中漢字爲utf-8的十六進制編碼,例如\xe4\xb8\xad\xe5\x9b\xbd,\xe4\xb8\xad\xe5\x9b\xbd\xe9\xa6\x99\xe6\xb8\xaf,無法通過“右鍵-->copy-->Bytes(Printable Text Only)方法將漢字字符串複製出來,給分析帶來阻礙。後來發現可以用“右鍵-->copy-->Bytes(Hex Stream)”將漢字的十六進制編碼以十六進制的形式拷貝出來,如:e4b8ade59bbd2ce4b8ade59bbde9a699e6b8af 。這樣就可以通過方法來把該字符串轉成漢字。每三個十六進制,可以轉成一個漢字,如:0xe4,0xb8,0xad 轉換成漢字就是“中”字。具體代碼實現如下:
byte[] b = {(byte)0xe4,(byte)0xb8,(byte)0xad };
try {
System.out.println(new String(b, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
但如果字符串很長,手動改成byte[]無疑是很麻煩的,所以進行了進一步的優化,代碼如下:
String str = "e4b8ade59bbd2ce4b8ade59bbde9a699e6b8af";// 需要轉換的字符串
byte[] b = new byte[str.length() / 2];// 每兩個字符爲一個十六進制確定數字長度
for (int i = 0; i < b.length; i++) {
// 將字符串每兩個字符做爲一個十六進制進行截取
String a = str.substring(i * 2, i * 2 + 2);
b[i] = (byte) Integer.parseInt(a, 16);// 將如e4轉成十六進制字節,放入數組
}
try {
// 將字節數字以utf-8編碼以字符串形式輸出
System.out.println(new String(b, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
try {
System.out.println(java.net.URLEncoder.encode("錯誤提示", "utf-8"));
System.out.println(java.net.URLDecoder.decode("%E9%94%99%E8%AF%AF%E6%8F%90%E7%A4%BA", "utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}