操作系统: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也出现了同样的问题。
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也出现了同样的问题。
应该这样取string.getBytes("GBK");
除非你把eclipse编辑器的编码改为shift_jis
因为jvm内存中的这个unicode字节码与波浪线使用sun.io.ByteToCharSJIS转换出来的unicode码不一致,因此导致了解码错误,最终显示为乱码。楼上的说法除了“getBytes用其他编码是不会取得正确字节的”都是正确的。
如果getBytes用其他编码是不会取得正确字节,那么使用new String(string.getBytes("unicode"),"unicode")就不能显示正常的字符了。