java中的编码

来源:互联网 发布:MS和MA知乎 编辑:程序博客网 时间:2024/05/17 07:15

 

  有关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%3F
gb2312编码: %D6%D0%CE%C4
utf-8编码:: %E4%B8%AD%E6%96%87
unicode编码:%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字符集,由于两者不兼容,所以会出现乱码。这段代码就是解决乱码的一个方法。

 

就这么多了。

 

 

原创粉丝点击