如何使用String构造方法和String.getBytes()做好中文字符转码
1 @Test 2 public void test() { 3 String testStr = "中"; 4 try { 5 // 得到指定编码的字节数组 字符串--->字节数组 6 byte[] t_iso = testStr.getBytes("ISO8859-1"); 7 byte[] t_gbk = testStr.getBytes("GBK"); 8 byte[] t_utf8 = testStr.getBytes("UTF-8"); 9 System.out.println("使用ISO解码..." + t_iso.length); 10 System.out.println("使用GBK解码..." + t_gbk.length); 11 System.out.println("使用UTF8解码..." + t_utf8.length); 12 // 解码后在组装 13 String ut_iso = new String(t_iso, "ISO8859-1"); 14 String ut_gbk = new String(t_gbk, "GBK"); 15 String ut_utf8 = new String(t_utf8, "UTF-8"); 16 System.out.println("使用ISO解码后再用ISO组装..." + ut_iso); 17 System.out.println("使用GBK解码后再用GBK组装..." + ut_gbk); 18 System.out.println("使用UTF8解码后再用UTF8组装..." + ut_utf8); 19 // 有时候要求必须是iso字符编码类型 20 // 可以先用GBK/UTF8编码后,用ISO8859-1组装成字符串,解码时逆向即可获得正确中文字符 21 String t_utf8Toiso = new String(t_utf8, "ISO8859-1"); 22 // 将iso编码的字符串进行还原 23 String ut_utf8Toiso = new String(t_utf8Toiso.getBytes("ISO8859-1"),"UTF-8"); 25 System.out.println("使用ISO组装utf8编码字符..." + t_utf8Toiso); 26 System.out.println("使用ISO解码utf8编码字符..." + ut_utf8Toiso); 27 } catch (UnsupportedEncodingException e) { 28 e.printStackTrace(); 29 } 30 }
为什么使用ISO8859-1编码再组合之后,无法还原"中"字呢?
其实原因很简单,因为ISO8859-1编码的编码表中,没有包含汉字字符,当然也就无法通过"中".getBytes("ISO8859-1");来得到正确的"中"字在ISO8859-1中的编码值了,所以再通过new String()来还原就无从谈起了.
有时候,为了让中文字符适应某些特殊要求(如http header头要求其内容必须为iso8859-1编码),可能会通过将中文字符按照字节方式来编码的情况,如:
String s_iso88591 = new String("中".getBytes("UTF-8"),"ISO8859-1"),这样得到的s_iso8859-1字符串实际是三个在ISO8859-1中的字符,在将这些字符传递到目的地后,目的地程序再通过相反的方式String s_utf8 = new String(s_iso88591.getBytes("ISO8859-1"),"UTF-8")来得到正确的中文汉字"中".这样就既保证了遵守协议规定、也支持中文.