String.getBytes()方法中的中文编码问题

http://www.pconline.com.cn/pcedu/empolder/gj/java/0404/351040_1.html

 

即使你知道了编码的编码格式,比如:
  javac -encoding GBK TestCharset.java
  编译后生成 的.class文件中仍然是以Unicode格式存储中文字符或字符串的。

  使用String.getBytes(String charset)方法

  所以,为了避免这种问题,我建议大家都在编码中使用String.getBytes(String charset)方法。下面我们将从字串分别提取ISO-8859-1和GBK两种编码格式的字节数组,看看会有什么结果:

class TestCharset

{   

        public static void main(String[] args)

       {  

                new TestCharset().execute(); 

       }

       private void execute()

      {  

            String s = "Hello!你好!";    

            byte[] bytesISO8859 =null;  

            byte[] bytesGBK = null;  

            try  

           {   

                bytesISO8859 = s.getBytes("iso-8859-1");   

                bytesGBK = s.getBytes("GBK");  

            }  

            catch (java.io.UnsupportedEncodingException e) 

           {   e.printStackTrace();  }  

           System.out.println("-------------- /n 8859 bytes:");  

           System.out.println("bytes is:     " + arrayToString(bytesISO8859));  

           System.out.println("hex format is:" +encodeHex(bytesISO8859));  

           System.out.println();  

           System.out.println("-------------- /n GBK bytes:");  

           System.out.println("bytes is:     " + arrayToString(bytesGBK));  

           System.out.println("hex format is:" + encodeHex(bytesGBK)); 

      } 

      public static final String encodeHex (byte[] bytes)

      {  

             StringBuffer buff = new StringBuffer(bytes.length * 2);  

             String b;  

             for (int i=0; i<bytes.length ; i++)  

            {   

                b = Integer.toHexString(bytes[i]);    // byte是两个字节的,而上面的Integer.toHexString会把字节扩展为4个字节   

                buff.append(b.length() > 2 ? b.substring(6,8) : b);   

                buff.append(" ");  

             }  

             return buff.toString(); 

       }

        public static final String arrayToString (byte[] bytes)

        {  

              StringBuffer buff = new StringBuffer();  

              for (int i=0; i<bytes.length ; i++)  

              {   

                  buff.append(bytes[i] + " ");  

              }  

              return buff.toString(); 

         }

}
执行上面程序将打印出:

  -------------- 8859 bytes:bytes is:     72 101 108 108 111 33 63 63 63hex format is:48 65 6c 6c 6f 21 3f 3f 3f-------------- GBK bytes:bytes is:     72 101 108 108 111 33 -60 -29 -70 -61 -93 -95hex format is:48 65 6c 6c 6f 21 c4 e3 ba c3 a3 a1

  可见,在s中提取的8859-1格式的字节数组长度为9,中文字符都变成了“63”,ASCII码为63的是“?”, 一些国外的程序在国内中文环境下运行时, 经常出现乱码,上面布满了“?”,就是因为编码没有进行正确处理的结果。而提取的GBK编码的字节数组中正确得到了中文字符的GBK编码。字符“你” “好”“!”的GBK编码分别是:“c4e3”“bac3”“a3a1”。得到了正确的以GBK编码的字节数组,以后需要还原为中文字串时,可以使用下面 方法:
  
  new String(byte[] bytes, String charset)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值