`

java编码格式总结

    博客分类:
  • java
阅读更多

乱码一直是一个很让人头疼的问题,这次往oracle的Blob里面写东西的时候,又出现了乱码。不过这次成功解决了,看了几篇讲java编码格式的文章恍然大悟,原理其实很简单,大家可以到这几个链接看看,他们写的很清楚:

 

 

http://lavasoft.blog.51cto.com/62575/273608

 

http://developer.51cto.com/art/200906/132635.htm

 

http://topic.csdn.net/u/20080822/11/69048375-6928-4a30-a58a-3ded53dc53f2.html

 

http://blog.csdn.net/fangao2620/archive/2008/02/25/2120221.aspx

 

http://jiangzhengjun.iteye.com/blog/512072

 

http://ayagen.iteye.com/blog/587653

 

其实,说白了就是,java中的String永远都是unicode编码的,以它作为中间结果转化成各种不同的编码格式,比如:

 

        String str = "中文";
        byte[] utf8b = str.getBytes("UTF-8");
        byte[] gbkb = str.getBytes("GBK");

        // 没有乱码
        System.out.println(new String(utf8b, "UTF-8"));

        // 没有乱码
        System.out.println(new String(gbkb, "GBK"));

        // 有乱码

        System.out.println(new String(gbkb, "UTF-8"));

        // 有乱码
        System.out.println(new String(utf8b, "GBK"));

 

byte数组utf8b和gbkb是不一样的,是转化成各自编码格式后的二进制数组,而new String(utf8b, "UTF-8")与new String(gbkb, "GBK")是一样的都是以Unicode编码保存。

 

我们可以来分析一下:

1. 当执行以下时:

byte[] utf8b = str.getBytes("UTF-8");
 

jvm实际上是做了这样的转化 UNICODE => UTF-8,就是将Jvm内存中的unicode编码二进制码转化成UTF-8格式的二进制码然后赋值给byte[] utf8b 。这个转化的过程我们不用管,jvm会根据一个编码格式对照表来转化。

 

2. 当执行后面代码:

new String(utf8b, "UTF-8")
 

实际上第二个参数"UTF-8"告诉jvm:“当前utf8b的编码格式是"UTF-8",你就以这个格式转化成unicode吧!”。也就是将utf8b转化成unicode再存入Jvm的内存,utf8=>unicode。(这个参数应该是为了告诉jvm使用“UTF-8”的编码格式对照表来转化)

 

很多时候出现乱码实际上就是第二个过程出现了问题,比如有个页面是以“UTF-8”方式编码的,当你提交了一个表单后,浏览器将表单的内容以“UTF-8”格式编码后以HTTP POST请求的方式发送到后台。当HTTP Post请求到达servlet后,提交的表单数据都是“UTF-8”编码的二进制数据。当你调用request.getParameter("someParam")的时候,servlet实际上将inputstream中“someParam”的数据取出,然后将其转化成字符转。为了便于理解,我们假设这段数据是一个byte[] pb,当你调用了request.getParameter("someParam")时相当于调用了new String(pb),由于你没有指定使用何种方式编码,因此,jvm使用系统默认的编码格式编码,这时如果你的系统默认编码格式是“UTF-8”那就相当与调用了

new String(utf8b, "UTF-8")
 

不会出现乱码。但是如果你很倒霉,你的默认编码格式是“GBK”那么就好比调用了

new String(utf8b, "GBK")
 

乱码就不可避免了。因为,jvm会试图将原来是"UTF-8"格式的数据使用"GBK"的对照表来转化成unicode,结果当然是牛头不对马嘴了。

 

分享到:
评论
2 楼 up2pu 2013-01-30  
讲的很好,谢谢
1 楼 QQ756054200 2012-09-18  
  谢谢了,有帮助

相关推荐

    Java中编码总结.pdf

    Java中编码总结.pdf

    Java编码规范总结

    文中部分节选 1.整型实例。 修复建议:使用Integer.valueOf()替代new Integer。 2.switch语句包含太少分支。 修复建议:分支比较少的时候建议使用if else。原因:switch用来处理多分支的情况。...

    Java编码规范(中文版)

    Java编码规范 java编码的经验总结

    java编码总结1

    NULL 博文链接:https://lhc1986.iteye.com/blog/1544701

    Java中编码方式和Unicode知识总结

    此文档为Java中编码方式和Unicode知识总结,对了解学习Java编码的讲解很全面清楚!

    JAVA编码机制

    JAVA编码问题的总结,详细解析JAVA编码机制和各种相关问题

    JAVA字符编码问题总结

     上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。  ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),...

    JAVA编程规则总结

    1,我不要自我重复: 这也许是在编程开发这最最基本的一个信条,就是要告诉你不要出现重复的代码。我们很多的编程结构之所以存在,就是为了帮助我们消除重复(例如,循环语句,函数,类,等等)。...

    Java中编码总结[整理].pdf

    Java中编码总结[整理].pdf

    Java中编码以及Unicode总结.doc

    Java中编码以及Unicode总结

    获取文件编码方式的两种方式(1.cpdetector第三方jar包,包含源码elipse项目;2.EncodingDetect.java工具类)

    做项目时总结的,java程序获取文件编码方式的两种最常用的方式(1.cpdetector第三方jar包,包含源码elipse项目;2.EncodingDetect.java工具类)。

    java编码方式全程跟进

    自己总结的有关java 编码方式的知识

    java 编码 UTF-8、ISO-8859-1、GBK

    ava支持UTF 8 ISO 8859 1 GBK等各种字体编码 可笔者发现Java中字体编码的问题仍难倒了不少程序员 网上虽然也有不少关于在Java中如何正确显示中文的文章 但都不够全面 笔者特意总结如下 影响Java中字体编码正确显示...

    java编码规范,word版

    结合实际开发经验,总结了java开发的编码规范!可以比较参考!

    java字符串编码转换代码

    总结了java中常见的utf-8、gbk等进行字符串编码转换

    阿里巴巴Java编码规范

    《阿里巴巴Java开发手册》是阿里内部Java工程师所遵循的开发规范,涵盖编程规约、单元测试规约、异常日志规约、MySQL规约、工程规约、安全规约等,这是近万名阿里Java技术精英的经验总结,并经历了多次大规模一线...

    java编码规范

    java 编码规范总结,从类名 包名 文件命名 方法命名等方面描述java代码在编写过程中的规范,同时提到了一些在写代码过程中的注意事项。

    史上最全的java基础总结大全

    //编码解码1:默认编码 String str1 = "你好"; byte[] buf1 = str1.getBytes();//默认解码:Unicode,四个字节 //编码解码2:指定编码 String str2 = "你好"; byte[] buf2 = str2.getBytes("UTF-8");//指定...

Global site tag (gtag.js) - Google Analytics