随笔-199  评论-203  文章-11  trackbacks-0
 Java是使用Unicode字符集的,意思是在内存运行的时候是这样的。当Java源程序被编译为.class文件的时候,是以UTF-8字符集存储字符的。比如字符串"汉语"的Unicode字符为:0x49 6C ED 8B。在.class文件中则变成了:0xE6 B1 89 E8 AF AD 0D 0A。实际上如果用以下程序输出“汉语”二个字的16进制字节序列:

        String str = "汉语";
            

 

        try{
byte[] b = str.getBytes("Unicode");
for(int i : b){
System.out.println(Integer.toHexString(i));
}       
}catch(Exception ex){
ex.printStackTrace();  }

    会发现,实际输出的是 0xFE FF 6C 49 8B ED。多出来的0xFE FF,是Unicode字符串的BOM(Byte Order Mark)。但是为什么输出的顺序(0xFE FF 6C 49 8B ED)和文件中的顺序不一致(0xFF FE 49 6C ED 8B)?

    public byte[] getBytes(Charset charset) 使用指定的字符集将此 String 解码为字节序列,并将结果存储到一个新的字节数组中。如果不指定参数,则使用系统默认的字符集,对于简体中文系统一般为GBK。

    看程序:

class EncodingExer 
{
public static void main(String[] args)
{
String str = "汉语";               //GBK编码为: 0xBABA 0xD3EF
byte[] b = str.getBytes();     
for(int i : b){
System.out.println(Integer.toHexString(i)); //0xBA 0xBA 0xD3 0xEF
}    }}

    在这个过程中,由Unicode字符得到字符串“汉语”,然后解码得到了GBK字节序列。与String.getBytes()相对应的是new String(byte[] bytes,Charset charset),它的作用是用字节序列生成字符串。如果想由刚才的GBK字节序列得到原来的字符串“汉语”,我们需要做的是:new String(b) 就可以了。将b按照GBK编码得到字符串“汉语”,然后转化为Unicode字符。如果是str.getBytes("iso-8859-1"),那么还原的时候就是new String(b,"iso-8859-1")。总之就是用什么方式编码,就用什么方式解码。

posted on 2009-05-06 20:11 Werther 阅读(1402) 评论(4)  编辑  收藏 所属分类: 10.Java

评论:
# re: 浅谈Java中的编码理论[未登录] 2009-05-06 22:28 | Dennis
最後兩句是錯的
str.getBytes("iso-8859-1") 時會出現永久性單向的 data lost, 不可能還原  回复  更多评论
  
# re: 浅谈Java中的编码理论[未登录] 2009-05-08 07:30 | shaofan
"但是为什么输出的顺序(0xFE FF 6C 49 8B ED)和文件中的顺序不一致(0xFF FE 49 6C ED 8B)?"

楼主第二段的这句话中,后面的这段编码应该是第一段提到的“UNICODE”的编码,而非文件中的编码,因为按楼主所说,文件中的编码是UTF-8?

另外,看了一遍还是没有明白为什么它们的输出的顺序不一致,楼主能否解释一下?

谢谢。  回复  更多评论
  
# re: 浅谈Java中的编码理论 2009-05-10 16:15 | luhua
楼主能否在讲一些java的编码知识,谢谢了  回复  更多评论
  
# re: 浅谈Java中的编码理论[未登录] 2009-05-12 14:54 | xxx

只有注册用户登录后才能发表评论。


网站导航: