在URL中传递中文的解决方式

2015年05月13日 17:13:55 thinkinglink 阅读数:10321 标签: URL编码中文编码乱码解决 更多

个人分类: web前端

在URL中传递中文的解决方式

1.第一种方式,主要是通过配置搞定 
1.1)在服务器端设置 
(1)在tomcat的配置文件中指定编码 
server.xml文件中指定:URIEncoding=”UTF-8”

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true" URIEncoding="UTF-8"/>
  • 1
  • 2
  • 3

URIEncoding告诉服务器servlet解码URL时采用的编码; 
useBodyEncodingForURI 告诉服务器解码URL时候需要采用request body指定的编码

(2)在weblogic服务器的配置文件中指定编码 
weblogic.xml 文件中指定UTF-8

    <input-charset> <java-charset-name>UTF-8</java-charset-name> </input-charset>
  • 1
  • 2
  • 3

1.2)在浏览器端设置 
在页面设置文件的编码和保存格式UTF-8 
在页面头设置:pageEncoding=”UTF-8” contentType=”text/html; charset=UTF-8” 
在HtmL中的meta设置:

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  • 1

这样设置后,满足在主流浏览器:chrome、firefox等浏览器URL中带有中文的请求自动转码问题, 
不需要额外在后台代码里进行手动转码。 
但是,对独树一帜的IE大浏览器仍旧不起效果,会出现令人头疼的乱码问题。解决方案看第3步了

1.3)在前端用js对URL进行编码后再发送请求(仅仅只是为了兼容IE) 
var srcUrl = _contextEbtPath + “/dic/index?condition=我是中文查询条件撒”; 
var encodeUrl = encodeURI(srcUrl); 
这样编码一次后,也不会影响其他主流浏览器的编码转换问题,得到彻底解决。

2.第二种也是最直接的方式,用硬编码解决 
直接在后台请求处理前,手动进行一次转码。 
缺点是凡是有中文请求URL的都需要硬编码一次,优点是直接明了。

condition = new String(condition.getBytes("iso8859-1"),"utf-8"); 
  • 1

3.相关知识延伸阅读 
3.1)在URL中中文字符通常出现在以下两个地方: 
http://localhost:8080/example/中 国 name=中国 
(1)Query String中的参数值,比如 keywords=中国 
(2)servlet path,比如: /中 国 
3.2)出现乱码问题的原因主要是以下几方面: 
(1)浏览器:我们的客户端(浏览器)本身并没有遵循URI编码的规范。 
(2)Servlet服务器:Servlet服务器的没有正确配置。 
3.3)相关知识:http请求的几个环节 
浏览器(ie firefox)—————–>Servlet服务器 ——————–>浏览器显示 
<编码> < 解码成unicode,然后将显示的内容编码> <解码> 
(1)浏览器把URL(以及post提交的内容)经过编码后发送给服务器。 
(2)这里的Servlet服务器实际上指的是由Servlet服务器提供的servlet实现ServletRequestWrapper, 
不同应用服务器的 servlet实现不同,这些servlet的实现把这些内容解码转换为unicode, 
处理完毕后,然后再把结果(即网页)编码返回给浏览器。 
(3)浏览器按照指定的编码显示该网页。 
注意: 
当对字符串进行编码和解码的时候都涉及到字符集,通常使用的字符集为ISO8859-1、GBK、UTF-8、UNICODE。 
3.4)相关知识:URL的组成及说明 
域名:端口/contextPath/servletPath/pathInfo queryString 
(1)contextPath是在Servlet服务器的配置文件中指定的 
(a)对于weblogic:contextPath是在应用 的weblogic.xml中配置。

<context-root>/</context-root> 
  • 1

(b)对于tomcat:contextPath是在server.xml中配置。

<Context path="/" docBase="D:/server/blog.war" debug="5" reloadable="true" crossContext="true"/>
  • 1

(c)对于jboos: contextPath是在应用的jboss-web.xml中配置

<jboss-web> <context-root>/</context-root>
</jboss-web>
  • 1
  • 2
  • 3

(2)servletPath是在应用的web.xml中配置

<servlet-mapping> <servlet-name>Example</servlet-name> <url-pattern>/example/*</url-pattern>
</servlet-mapping> 
  • 1
  • 2
  • 3
  • 4

3.5)相关知识:Servlet获取URL的值及参数 API 
(1)获得 queryString的参数值(来自于GET和POST),其值经过Servlet服务器URL Decode 过的 
request.getParameter(“name”); 
(2)获取 pathinfo 信息,返回的字符串是经过Servlet服务器URL Decode过的 
request.getPathInfo(); 
(3)获取 requestURI 浏览器提交过来的原始数据,未被Servlet服务器URL Decode过。 
requestURI = request.getRequestURI();

3.6)相关知识:servlet规范(开发人员必须清楚的servlet规范:) 
(1) HttpServletRequest.setCharacterEncoding()方法 仅仅只适用于设置post提交的request body的编码而不是设置get方法提交的queryString的编码。 
该方法告诉应用服务器应该采用什么编码解析post传过来的内容。很多文章并没有说明这一点。 
(2) HttpServletRequest.getPathInfo()返回的结果是由Servlet服务器解码(decode)过的。 
(3) HttpServletRequest.getRequestURI()返回的字符串没有被Servlet服务器decoded过。 
(4) POST提交的数据是作为request body的一部分。 
(5) 网页的Http头中ContentType(“text/html; charset=GBK”)的作用: 
(a) 告诉浏览器网页中数据是什么编码; 
(b) 表单提交时,通常浏览器会根据ContentType指定的charset对表单中的数据编码,然后发送给服务器的。 
这里需要注意的是:这里所说的ContentType是指http头的ContentType,而不是在网页中meta中的ContentType。 
3.7)浏览器和服务器对编码的解析 
URL:http://localhost:8080/example/中 国 name=中国 
汉字   编码    二进制表示 
中国   UTF-8    0xe4 0xb8 0xad 0xe5 0x9b 0xbd[-28, -72, -83, -27, -101, -67] 
中国   GBK     0xd6 0xd0 0xb9 0xfa[-42, -48, -71, -6] 
中国   ISO8859-1 0x3f,0x3f[63, 63]信息失去 
3.7.1)浏览器发送请求时的编码 
<1>GET方式提交,浏览器会对URL进行URL encode,然后发送给服务器。 
(a)对于中文IE,如果在高级选项中选中总以UTF-8发送(默认方式),则PathInfo是URL Encode是按照UTF-8编码,QueryString是按照GBK编码。 
http://localhost:8080/example/中 国 name=中国 
实际上提交是:GET /example/%E4%B8%AD%E5%9B%BD name=%D6%D0%B9%FA 
(b)对于中文IE,如果在高级选项中取消总以UTF-8发送,则PathInfo和QueryString是URL encode按照GBK编码。 
实际上提交是:GET /example/%D6%D0%B9%FA name=%D6%D0%B9%FA 
(c)对于中文firefox,则pathInfo和queryString都是URL encode按照GBK编码。 
实际上提交是:GET /example/%D6%D0%B9%FA name=%D6%D0%B9%FA 
很显然,不同的浏览器以及同一浏览器的不同设置,会影响最终URL中PathInfo的编码。 
对于中文的IE和FIREFOX都是采用GBK编码 QueryString。 
小结,解决方案: 
(a)**URL中如果含有中文等非ASCII字符,则浏览器会对它们进行URLEncode。为了避免浏览器采用了我们不希望的编码, 
所以最好不要在URL中直接使用非ASCII字符,而采用URL Encode编码过的字符串%.** 
比如:URL:http://localhost:8080 /example/中国 name=中国 
建议:URL:http://localhost:8080/example/%D6%D0 %B9%FA name=%D6%D0%B9%FA 
(b)我们建议URL中PathInfo和QueryString采用相同的编码,这样对服务器端处理的时候会更加简单。 
<2>POST方式提交 
对于POST方式,表单中的参数值对是通过request body发送给服务器,**此时浏览器会根据网页的ContentType(“text/html; charset=GBK”) 
中指定的编码进行对表单中的数据进行编码**,然后发给服务器。 
在服务器端的程序中我们可以通过 Request.setCharacterEncoding() 设置编码,然后通过request.getParameter获得正确的数据。 
解决方案: 
从最简单,所需代价最小来看,我们对URL以及网页中的编码使用统一的编码对我们来说是比较合适的。 
如果不使用统一编码的话,我们就需要在程序中做一些编码转换的事情。这也是我们为什么看到有网络上大量的资料介绍如何对乱码进行处理, 
其中很多解决方案都只是一时的权宜之计,没有从根本上解决问题。

3.7.2)Servlet服务器 
Servlet服务器实现的Servlet遇到URL和POST提交的数据中含有%的字符串,它会按照指定的字符集解码。 
下面两个Servlet方法返回 的结果都是经过解码的: 
request.getParameter(“name”); 
request.getPathInfo(); 
这里所说的”指定的字符集”是在应用服务器的配置文件中配置。 
(1) tomcat服务器 
对于tomcat服务器,该文件是server.xml

<Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK"/> 
  • 1
  • 2
  • 3

URIEncoding告诉服务器servlet解码URL时采用的编码。

<Connector port="8080" ... useBodyEncodingForURI="true" /> 
  • 1

useBodyEncodingForURI 告诉服务器解码URL时候需要采用request body指定的编码。

(2) weblogic服务器 
对于weblogic服务器,该文件是weblogic.xml

<input-charset> <java-charset-name>GBK</java-charset-name>
</input-charset> 
  • 1
  • 2
  • 3

3.7.3)浏览器显示 
浏览器根据http头中的ContentType(“text/html; charset=GBK”),指定的字符集来解码服务器发送过来的字节流。 
我们可以调用 HttpServletResponse.setContentType()设置http头的ContentType。

总结: 
(1)URL中的PathInfo和QueryString字符串的编码和解码是由浏览器和应用服务器的配置决定的, 
我们的程序不能设置,不要期望用request.setCharacterEncoding()方法能设置URL中参数值解码时的字符集。 
所以我们建议URL中不要使用中文等非ASCII字符,如果含有非ASCII字符的话要使用URLEncode编码一下,比如: 
http://localhost:8080 /example1/example/中国 
正确的写法: 
http://localhost:8080/example1/example/%E4%B8%AD%E5%9B%BD 
并且我们建议URL中不要在PathInfo和QueryString同时使用非ASCII字符,比如 
http://localhost:8080 /example1/example/中国 name=中国 
原因很简单:不同浏览器对URL中PathInfo和QueryString编码时采 用的字符集不同,但应用服务器对URL通常会 
采用相同的字符集来解码。

(2)我们建议URL中的URL Encode编码的字符集和网页的contentType的字符集采用相同的字符集,这样程序的实现就很简单, 
不用做复杂的编码转换。 JS中对中文(UTF-8格式保存的)进行编码(unicode编码)的函数常用有:encodeURI(str); encodeURIComponent(str);

在URL中传递中文的解决方式相关推荐

  1. jquery.ajax的url中传递中文乱码问题的解决方法

    jquery.ajax的url中传递中文乱码问题的解决方法 JQuery JQuery默认的contentType:application/x-www-form-urlencoded 这才是JQuer ...

  2. Js的Url中传递中文参数乱码的解决

    一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面 Javascript代码: 2. 接收参数页面:test02.html 二:如何获取Url ...

  3. url中传递中文参数时的转码与解码

    URL传递中文参数时的几种处理方式,总结如下: 1.将字符串转码:newString("xxxxx".getBytes("iso-8859-1")," ...

  4. js获取url中的参数,url中传递中文的时候通过js解码的方式

    如果传递的参数是: <a href="${pageContext.request.contextPath}/productdisplay/productDisplay_productD ...

  5. spring mvc中关于url中传递中文乱码的解决方法

    在传值过程中,也是乱码出现的频繁地.先不说到底是什么场景了,通常常用的方案有如下几个 配置指定的filter <!-- 配置请求过滤器,编码格式设为UTF-8,避免中文乱码--><f ...

  6. python url中传递中文_Python编程:URL网址链接中的中文编码与解码

    网址链接中的中文编码 中文的gbk(GB2312)编码: 一个汉字对应两组%xx,即%xx%xx 中文的UTF-8编码: 一个汉字对应三组%xx,即%xx%xx%xx 可以利用百度进行URL编码解码 ...

  7. 解决JS在url中传递参数时参数包含中文乱码的问题

    解决JS在url中传递参数时参数包含中文乱码的问题 参考文章: (1)解决JS在url中传递参数时参数包含中文乱码的问题 (2)https://www.cnblogs.com/xushengguan/ ...

  8. url中向后台传递中文乱码解决方法

    url中向后台传递中文乱码解决方法 参考文章: (1)url中向后台传递中文乱码解决方法 (2)https://www.cnblogs.com/shijiaoyun/p/3992446.html 备忘 ...

  9. java.net.url 中文乱码_asp.net URL中包含中文参数造成乱码的解决方法

    asp.net URL中包含中文参数造成乱码的解决方法 更新时间:2010年03月08日 21:44:27   作者: 中文乱码一直以来是WEB开发中比较常见的问题之一,对于初学者来说,各种各样的编码 ...

最新文章

  1. python模块收集
  2. 【前端学习日记】用reveal.js实现制作网页幻灯片
  3. 浅析SAP EWM与WMS的差异
  4. 获取jar包内部的资源文件
  5. 不懂网络和懂一点的区别
  6. 所有C#程序员必须知道的13件事
  7. windows pycharm如何恢复默认设置_如何备份/恢复一个基于Windows系统的操作面板?...
  8. 小米pro笔记本加装dw1820a无线网卡,完美装苹果macOS
  9. Vivo手机originOS安装谷歌套件服务框架GMS安装谷歌三件套,进Google Play商店下载应用
  10. 必读的android 文章- 收藏集 - 掘金
  11. 运营15年的飞扬军事论坛宣布停止运营 关闭服务器
  12. 用telnet逛bbs
  13. 部署并安装Discuz
  14. 宜信微服务架构落地及其演进
  15. 框架-Laraver
  16. 计算机组成原理偶校验编码设计,计算机组成原理校验码生成电路的设计.doc
  17. 不同分辨率标准,720p 1080p 2k 4k HD FHD UHD
  18. 被微软打入冷宫20年,它刚回归就成了热门!
  19. Web3中文|构建Web3融资交易:股权和内部代币分配的比例
  20. 数字孪生技术,可视化系统?

热门文章

  1. 红帽linux6主板,Linux_I810 Graphics LINUX Driver的安装,我的机子的主板是承启6WIV主板 - phpStudy...
  2. 我的C++回调函数的理解
  3. Hive中小表与大表关联(join)的性能分析
  4. matplotlib 的 marker 颜色更改
  5. android愤怒小鸟游戏、自定义View、掌上餐厅App、OpenGL自定义气泡、抖音电影滤镜效果等源码... 1
  6. Spark 安装配置及下载地址
  7. CWnd 对象怎么和 HWND 窗口句柄相互转化
  8. 红黑树 键值_大厂面试官:说一下JDK1.8 HashMap有哪些亮点?
  9. Vundle ,Vim Bundle
  10. 数据结构——左子右兄二叉树