通过上网查找
大家都说 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编码格式的呢????
大家都说 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编码格式的呢????
包含中文的url目前我知道的有两点坏处:1.IE6下可能会造成最后一个汉字乱码,原因是IE6不支持某字符集编码,或者支持的不好。2.带有中文的url复制在qq对话框里时会被解析不完全,点击后经常是死链。
URLEncoder.encode("中国","utf-8")编码后加到URL上,在服务器端利用
URLDecoder.decode(URLDecoder.decode("中国","utf-8"),"utf-8");参数顺序我记不清了,基本思想就是客户端编码一次,服务器端解码两次,保证没有问题!
对于google来说 一切皆有可能
添加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文件中设置编码了
注意:想第二种情况下,不能使用第一种情况下的解决方案,否则会输出”?”
他的服务器设置的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
下面才是正确的
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
这个不是 转换
而是对于提交的url参数
先进行检测
判断是GBK还是UTF-8
判断后 在转换
所以 google.cn对于GBK和UTF-8都可以正确识别了!