转载请注明出处: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(); }