操作系统:windows xp中文版
java版本:jdk 1.6
eclipse版本:eclipse 3.2 中文版(默认的字符编码是GBK)
在测试全角波浪线~在shift_jis编码下有几个字节组成时发现了问题:
public class Test05 { public static void main(String[] args) {
String string = "~";
byte[] bt = new byte[2];
try {
bt = string.getBytes("shift_jis");
for(int i=0;i<bt.length;i++)
{
System.out.println(bt[i]);
}
System.out.println(new String(string.getBytes("shift_jis"),"shift_jis"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }}
打印结果是:
63
?
全角波浪线使用shift_jis编码时应该打印两个字节才对(在网上查到它的字节码是0x8160(16进制,两个字节,高位在前)),但为什么这里只打印了一个字节,再使用shift_jis解码时也出现了乱码。
向高手请教一下。
补充一下在日文版的windows xp也出现了同样的问题。

解决方案 »

  1.   

    你这个全角波浪线是GBK编码的,所以getBytes用其他编码是不会取得正确字节的,
    应该这样取string.getBytes("GBK");
    除非你把eclipse编辑器的编码改为shift_jis
      

  2.   

    这个全角波浪线用gbk编码不假,这也是eclipse编辑器在编译这个java文件时默认的编码。jvm使用的是unicode,它会使用sun.io.ByteToCharGBK来实现这种转换,获得波浪线的unicode字节码,这个字节码在调用getBytes("shift_jis")时,会使用sun.io.CharToByteSJIS获得shift_jis编码的字节码,但在这一步转换出现了错误。
    因为jvm内存中的这个unicode字节码与波浪线使用sun.io.ByteToCharSJIS转换出来的unicode码不一致,因此导致了解码错误,最终显示为乱码。楼上的说法除了“getBytes用其他编码是不会取得正确字节的”都是正确的。
    如果getBytes用其他编码是不会取得正确字节,那么使用new String(string.getBytes("unicode"),"unicode")就不能显示正常的字符了。