java中的编码

    技术2025-08-22  7

     

      有关java的编码一直都不熟悉,都是在糊里糊涂的用。最近有时间,上网收集了一些相关的资料,稍作整理,有几点收获,愿与大家分享。

      1. java环境相关的编码。

         Java的字符串是unicode编码的。这个是理解java编码的基础,一定要记住!

         此外,Javaclass文件采用utf-8的编码方式,JVM运行时采用utf-16

     

      2. 经常出现的几种编码方式介绍。

       1)  ISO8859-1。它是属于单字节编码,字符范围是0-255,应用于英文系列。当然,它是没法表示中文了。虽然这个编码表示的范围很弱,但是它的作用可不小。很多协议默认都采用该编码,它也是Java网络传输使用的标准字符集,关于这一点,后面会讲到。

      2)  GB2312/GBKgb2312属于双字节编码,它是专门的中文编码方式(兼容iso8859-1),准确的说是简体中文编码gbk是对gb2312的扩充,它可以表示繁体中文和简体中文。还有一种GB18030,它也是gb2312的扩充,收录了我国少数民族的文字。

    3)  Unicode。它是统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。它不兼容任何编码。其实相对于iso8859-1编码来说,unicode编码只是在前面增加了一个0字节,比如字母a"00 61"

    4)  UTFutf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。这样比unicode省空间。

    关于编码的更多详细情况,请Google吧,它能告诉你一切想要的!

    对字符串中文进行编码,测试代码如下:

             public static String encode(String str, String charset) {

                       if (StringUtil.isNil(str))

                                return "";

     

                       String s = str;

     

                       try {

                                s = URLEncoder.encode(str, charset);

                       } catch (UnsupportedEncodingException e) {

                                System.out.println("编码方式有误:"+e.getMessage());

                       }

                       return s;

           }

     

             public static void main(String[] args) {

                       String s1 = "中文";

     

                       String iso = encode(s1, "iso-8859-1");  //不支持中文,所以编码后为3f3f??

                       String gb = encode(s1, "gb2312");

                       String unicode = encode(s1, "unicode");

                       String utf8 = encode(s1, "utf-8");;

                      

                       System.out.println("ISO8859-1编码: "+ iso);

                       System.out.println("gb2312编码: "+ gb);

                       System.out.println("utf-8编码:: "+ utf8);

                       System.out.println("unicode编码:"+ unicode);

             }

    程序执行结果如下:

    ISO8859-1编码: %3F%3Fgb2312编码: %D6%D0%CE%C4utf-8编码:: %E4%B8%AD%E6%96%87unicode编码:%FE%FF%4E%2D%65%87

     

     

    3.java虚拟机的默认编码方式

    System.out.println(Charset.defaultCharset());

    默认 charset 在虚拟机启动时决定,通常根据语言环境和基础操作系统的 charset 来确定。在我的机器下打印出的结果:

    GBK

     

     

    4. 需要注意java编码的时候

     1)读取外部文件时。

       简单讲,一句话,采用什么编码方式编写的文件就用什么方式读取。不然就可能是乱码

    新建一个记事本,写入部分数据,直接保存为code.txt3中所示,我的机器上默认的就是gbk编码)。之后将该文件另存为utf-8格式的文件。

    String filestr = "";

                       try {

                                InputStream is = new FileInputStream("F:/code2.txt");

                                InputStreamReader reader = new InputStreamReader(is,"utf-8"); 

                                 int tempchar;

                      while ((tempchar = reader.read()) != -1) {

                          if (((char) tempchar) != '/r') {

                              //System.out.print((char) tempchar);

                              filestr += Character.toString(((char) tempchar));

                          }

                      }

                      reader.close();

                       } catch (FileNotFoundException e) {

                                System.out.println("找不到指定文件!");

                       }catch (UnsupportedEncodingException e) {

                                e.printStackTrace();

                       }catch (IOException e) {

                                e.printStackTrace();

                       }  

                       System.out.println("文件的内容:");

                       System.out.println(filestr);

    测试结果:

    文件的内容:编码测试中文

     

      上面的代码中,将code2.txt换为code.txt,同时去掉InputStreamReader中的“utf-8”参数,也可以正常输出。因为InputStreamReader采用的编码方式是JVM的默认字符集,在我的机器上也就是gbk了。试着直接去掉上面代码中的InputStreamReader中的“utf-8”,那么你将很荣幸的见到:

    文件的内容:缂栫爜娴嬭瘯涓枃

     

    2 网页表单提交的时候

       其实这个可以用其他的方式避免编码问题,参考http://www.examda.com/Java/jichu/20080409/105519579.html

    我在这讲一种经常用到的编码转换方式:

    byte[] b = strIn.getBytes("ISO-8859-1");

              strOut = new String(b, "GB2312");

    前面提到ISO-8859-1的作用,这里可以讲一下了。

    首先讲一下这段代码的意思,强调一点,这段代码并不是真的将一种编码方式转化为另外一种。事实是这样的:我们本应该用GB2312的编码来读取数据并解码成字符串,但结果却采用了ISO-8859-1的编码,导致生成一个错误的字符串。现在要恢复,就要先把字符串恢复成原始字节数组,然后通过正确的编码GB2312再次解码成字符串(即把以GB2312编码的数据转成unicode的字符串)。再次强调,java中字符串永远都是unicode编码的!。

    现在可以说一下这段代码为什么出现了。iso-8859-1JAVA网络传输使用的标准 字符集,gb2312是标准中文字符集,当你提交中文表单,即有了网络传输操作,,浏览器会用gb2312格式来解释iso-8859-1字符集,由于两者不兼容,所以会出现乱码。这段代码就是解决乱码的一个方法。

     

    就这么多了。

     

     

    最新回复(0)