String s = request.getParameter("name");
String name= new String(s.getBytes("ISO-8859-1"), "GBK");
------
这里为什么getBytes()是IS0-8859-1编码?为不什么不是UTF-8或其他?
new String(,"GBK") ,为什么是GBK,而不是BIG或者其他?---
我的页面都是GBK编码格式的,new String(s.getBytes("ISO-8859-1"), "GBK") 这语句是正确的,我只是不明白其中原理

解决方案 »

  1.   

    1.ISO-8859-1是国际标准化组织内第一个8位字符集,这是规定的。就像你安装MySQL数据库的时候也可以选择字符集。其中默认的就是Latin-1(也就是ISO-8859-1)了。但你可以选择安装UTF-8或别的。
    2.你也可以不用GBK啊,我平时就用UTF-8。new String(..,"utf-8") 
      

  2.   

    很容易理解的。Java 虽然是采用 Unicode 字符的。但是在网络通信中,都是采用字节进行传输的,由于在传输时并没有告之 tomcat 使用什么编码,那么 tomcat 就会使用 ISO8859-1 的编码格式进行传输。举个例子吧,比如我们要传输的字符串是“劳动节快到了”,这个串的 GBK 编码为:c0cd b6af bdda bfec b5bd c1cb (GBK 是采用两个字节的,这里采用空格进行了分隔)在网络传输中是以 Big-Endian 方式传送的,也就是一个字节一个字节地传,依次会这样:c0 cd b6 af bd da bf ec b5 bd c1 cb在 tomcat 接收到这些字节时,并不知道该如何去组装这些字节,默认就使用一个字节编码的 ISO8859-1 进行编码,得出的字符为:À  Í  ¶  ¯  ½  Ú  ¿  ì  µ  ½  Á  Ë
    c0 cd b6 af bd da bf ec b5 bd c1 cb这很明显是不正确的,但是我们如果使用传输之前的编码进行组装的话,编码器就会根本字符集的特征将这些字节组装并编码成字符串了。像上面这个如果使用 new String(s.getBytes("ISO-8859-1"), "GBK") 的话,就会两个字节,两个字节的进行组装: 劳   动   节   快   到   了
    c0cd b6af bdda bfec b5bd c1cb不知道这样说,你能明白么?
      

  3.   

    如果对编码格式熟悉的话,出现了乱码,那基本上只要看一下这个乱码的特征就会知道什么地方转码出现了错误。比如:* 出现一些稀奇古怪的符号(没有一个是汉字的),这一般是 GBK 或者 UTF-8 采用 ISO8859-1 进行显示了。
    * 如果出现稀奇古怪的符号,并夹杂着一些繁体或者简体汉字的话,这一般是 GBK 与 UTF-8 转码出现了错误。如果出现的字符数比原字符数多的话,那表明本该 UTF-8 的字符采用 GBK 进行转码了,如果出现的字符数比原字符数少的话,那表明本该 GBK 的字符采用 UTF-8 进行转码了。
      

  4.   

    3楼说的很清楚了,让我明白了s.getBytes("ISO-8859-1")的意义。
    但new String(s.getBytes("ISO-8859-1"), "GBK") 的后半段还没明白 ,为什么是GBK ? 这个GBK 与那里的设置关系?说明一下,我用的是tomcat,服务器没有进行任何的配置。
      

  5.   

    你页面上肯定有跟 GBK 相关的代码吧?否则怎么可能会是 GBK 呢,呵呵。
      

  6.   

    你页面上应该有这么一句话吧:<%@ page contentType="text/html; charset=gbk" %>这就表示这个页面的内容采用 GBK 编码的,如果是在文本域中新输出的汉字也是采用 GBK 编码的。
      

  7.   

    ISO-8859-1国际编码起到桥梁作用.中文-->ISO-8850-1-->中文。这个也是乱码搞定的常用的方法。
    而中文编码有:gbk,gb2312,UTF-8.Windows使用的gbk。
    如果你页面编码要统一,才不会出现乱码,也不用转换。
      

  8.   


    问下 火龙果  那个 在Servlet中request.setCharactorEncoding是不是就是设置组装的格式??
      

  9.   

    String s = request.getParameter("name");
    String name= new String(s.getBytes("ISO-8859-1"), "GBK");
    ------
    这里为什么getBytes()是IS0-8859-1编码?
    这里的编码不一定是IS0-8859-1,这里的编码要看在传name这个属性的jsp页面中的编码,这里填的编码就是jsp页面中的编码。
    new String(,"GBK") ,为什么是GBK,而不是BIG或者其他?
    GBK是你想转换成的编码一般是要和数据库一样的编码。
    总结就是:
    String s = request.getParameter("name");
    String name= new String(s.getBytes("jsp页面的上的编码"), "自己想要的编码(一般是数据库的编码 或这要跳转后的jsp编码)");