String中文字符转码

如何使用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")来得到正确的中文汉字"中".这样就既保证了遵守协议规定、也支持中文.

原文地址:https://www.cnblogs.com/ikuman/p/3238596.html