通过上网查找
大家都说 google是采用utf-8编码的url当我们在google主页中 搜索  中国人民
地址栏会显示
http://www.google.cn/search?hl=zh-CN&newwindow=1&q=%E4%B8%AD%E5%9B%BD%E4%BA%BA%E6%B0%91&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&oq=也就是说
http://www.google.cn/search?q=中国人民
会被转换成
http://www.google.cn/search?q=%E4%B8%AD%E5%9B%BD%E4%BA%BA%E6%B0%91但是当是用 中国人民  的GBK编码的url
http://www.google.cn/search?q=%D6%D0%B9%FA%C8%CB%C3%F1为什么也可以正常访问的呢???我自己写的代码中
在tomcat中配置
URIEncoding="UTF-8"
http://127.0.0.1:8080/struts2/welcome.jsp?tip=%E4%B8%AD%E5%9B%BD%E4%BA%BA%E6%B0%91
页面可以显示 中国人民而
http://127.0.0.1:8080/struts2/welcome.jsp?tip=%D6%D0%B9%FA%C8%CB%C3%F1
就会显示乱码
当设置成URIEncoding="GBK"时则显示 中国人民也就是说url的参数部分  编码格式与tomcat中配置的一致时,不会出现乱码
那么问题是google是如何做到能够正常接收两种url编码格式的呢????

解决方案 »

  1.   

    这个应该是一个加密解密算法,将url重写了。
    包含中文的url目前我知道的有两点坏处:1.IE6下可能会造成最后一个汉字乱码,原因是IE6不支持某字符集编码,或者支持的不好。2.带有中文的url复制在qq对话框里时会被解析不完全,点击后经常是死链。
      

  2.   

    在客户端利用
    URLEncoder.encode("中国","utf-8")编码后加到URL上,在服务器端利用
    URLDecoder.decode(URLDecoder.decode("中国","utf-8"),"utf-8");参数顺序我记不清了,基本思想就是客户端编码一次,服务器端解码两次,保证没有问题!
      

  3.   

    Google 用的又不是 Tomcat 容器,而且在 GET 乱码上只有 tomcat 有这个问题,其他的 Servlet 容器或 J2EE 应用服务器就不存在这个问题。
      

  4.   

    加在url后面的都是get方式提交,针对这种提交方式,就算它是tomcat,在后台servlet里面的doGet方法里面做下检测再转码,对于google来说应该不是什么难事吧?
      

  5.   

    楼主多虑啦
    对于google来说  一切皆有可能
      

  6.   

    Servlet解决服务器端传给客户端产生的乱码问题
    添加GB2312编码
    向服务器输出中文时出现乱码或“?”最常用的解决方案:
    service(HttpServletRequest request,HttpServletResponse response){
    String s =” 中文”;
    response.setContentType(“text/html;charset=utf-8”);
    PrintWriter out = response.getWriter();
    out.println(s);
    }
    以上方法有时候会失灵,所以使用下面试试:
    service(){
    String s = “中文”;
    PrintWriter out = response.getWriter();
    response.setHeader(“Content-Type”,”text/html;charset=utf-8”);//设置Conten-Type响应头
    out.println(new String(s.getByte(“utf-8”),”iso-8859-1”));
    }//获得utf-8编码的字节数组后,将其按原样保存在String对象中
    }
    解决服务器端程序读取中文消息乱码问题:
     客户端传来的数据要进过HTTP协议解析,解析的时候使用URLEncoding方式编码,所以在服务器端需要解码,方式:
    String s =”%E9%A3%9E%E7%BF%94”://包含URL编码的字符串
    Sys…(java.net.URLDecoder.decode(s,”utf-8”));//使用utf-8字符集编码对该字符串解码,
    但是tomcat在内部自动完成了这一步,就是当开发人员通过getParameter方法获得name参数值是,tomcat已经使用decode方法对请求的参数惊醒转换了。因此这里就会产生一个问题,Tomcat并不知道要使用utf-8编码格式进行转换,而decode方法的第二个参数需要一个知道的编码格式。那么tomcat又是根据什么编码格式进行编码转换的呢?实际上,在默认情况下,tomcat是使用iso-8859-1编码格式进行转换的,如果按照iso-8859-1进行编码,就相当于直接将字节存放到String变量中,不做任何转换。如下面代码所示:String s=” %E9%A3%9E%E7%BF%94”;
    String s = URLDecoder.decode(s,”iso-8859-1”);
    Sy…(s);
    上面的代码中的s变量所对应的字节仍然是“E1 A3…”,由于java内部使用的是UCS2编码,但现在s变量里保存的是UTF-8,更糟糕的是,java把这些编码当成了ucs2编码来解析了,也就是说,对于java来说,这个6个字节的utf-8编码就成了3个UCS2编码格式的字符,因此,就会持续乱码。既然知道了原理,那就非常容易解决了。只需要将这些UTF-8编码再转换成UCS2编码保存在s变量中即可,如下:
    String s1=" %E9%A3%9E%E7%BF%94";
    try {
    String s2 = URLDecoder.decode(s1,"iso8859-1");
    System.out.println(new String(s2.getBytes("iso8859-1"),"utf-8")+"=====================");
    } catch (UnsupportedEncodingException e) {
    // XXX Auto-generated catch block
    e.printStackTrace();
    }在tomcat下设置编码:
    在默认情况下,tomcat是使用iso8859-1进行编码的,但是如果修改了这个默认值,就可以直接输出中文了。有了这种解决方案,就不能使用以上解决方案了。
    在<Connector port=”8080 protocol=”HTTP/1.1“20000   8443。
    URIEncoding=”UTF-8”/>//这样设置之后不需要在java文件中设置编码了
    注意:想第二种情况下,不能使用第一种情况下的解决方案,否则会输出”?”
      

  7.   

    B8%AD%E5%9B%BD%E4........这个不是乱码呀
      

  8.   

    可以试试这个方法:encodeURIComponent  用法:url中需要传递的参数用encodeURIComponent(参数) 
      

  9.   

    好了,这个问题,我清楚了google 使用了转换这个程序 我已经搜索到了谢谢大家的回答,google 的服务器同样会出现乱码,
    他的服务器设置的url编码格式是utf-8
    如果是gbk编码的url会出错的
    大家试一试
    http://www.google.com.us/search?q=%D6%D0%B9%FA%C8%CB%C3%F1
    google英文 一样乱码那么google.cn为什么不出错呢
    google考虑到中国的使用环境,所以
    google在中国的服务器端,对于url编码格式,进行了转换
    请参照
    http://www.jb51.net/article/17068.htm
      

  10.   

    不好意思,google英文的url贴错了
    下面才是正确的
    GBK编码
    http://www.google.com/search?q=%D6%D0%B9%FA%C8%CB%C3%F1UTF-8编码
    http://www.google.com/search?q=%E4%B8%AD%E5%9B%BD%E4%BA%BA%E6%B0%91
      

  11.   


    这个不是 转换
    而是对于提交的url参数
    先进行检测
    判断是GBK还是UTF-8
    判断后 在转换
    所以 google.cn对于GBK和UTF-8都可以正确识别了!