ajax中文编码问题--encodeURIComponent() 与encodeURI()
2010-11-02 09:19
387 查看
转自:http://religiose.javaeye.com/blog/701543
一般情况下, 发送 encodeURIComponent(parmeName)+"="+encodeURIComponent(parmeValue);
接收时, 直接 String paramValue = request.getParameter(paramName); // 容器自动解码.
我们知道 encodeURIComponent 使用的是 UTF-8 编码规则来编的.
如果 request.getParameter(paramName) 时,容器也按 UTF-8 解的话,是正确的. 根本无须在客户端
进行二次的 encodeURIComponent(...)
如果 request.getParameter(paramName),容器没有按 UTF-8 解的话, 结果只有一个,就是乱码
!
容器按什么编码来解码,决定于 request.setCharacterEncoding(***) 或者 服务器程序配置.
如果你在 jsp 程序中,能够 request.setCharacterEncoding("UTF-8"), 并且 修改服务器配置,让容器在解 GET 提交的参数时,使用 UTF-8.
客户端提交前不用二次编码, 接收时,也只要直接 request.getParameter(paramName) 即可
---------------------
为什么网上会有人提出在客户端对字符串重复编码两次呢.
如果因为项目需要,不能指定容器使用何种编码规则来解码提交的参数, 比如:需要接收来自不同页面,不地编码的参数内容时。 (又或者是开发人员被这有点复杂的东东搞得晕头转向,不懂得如何正确的去做好这接收参数的工作)
这个时候,在客户端对参数进行二次编码,可以有效的避开
“提交多字节字符
”的这个棘手问题。
因为第一次编码,你的参数内容便不带有多字节字符了,成了纯粹的 Ascii 字符串。(这里把编第一次的结果叫成 [STR_ENC1
] 好了。[STR_ENC1] 是不带有多字节字符的)
再编一次后,提交,接收时容器自动解一次 (容器自动解的这一次,不管是按 GBK 还是 UTF-8 还是 ISO-8859-1 都好,都能够正确的得到 [STR_ENC1])
然后,再在程序中实现一次 decodeURIComponent (Java中通常使用 java.net.URLDecoder(***, "UTF-8")) 就可以得到想提交的参数的原值。
使用 <form>...</form> 提交的,浏览器会自动编码一次.
ajax 提交的,需要自己手动编码。
---------------------
为什么要连续两次调用
encodeURI(String)
方法呢?是因为
Java
中的
request.getParameter(String)
方法会进行一次
URI
的解码过程,调用时内置的解码过程会导致乱码出现。而
URI
编码两次后,
request.getParameter(String)
函数得到的是原信息
URI
编码一次的内容。接着用
java.net.URLDecoder.decode(String str,String codename)
方法,将已经编码的
URI
转换成原文。
一般情况下, 发送 encodeURIComponent(parmeName)+"="+encodeURIComponent(parmeValue);
接收时, 直接 String paramValue = request.getParameter(paramName); // 容器自动解码.
我们知道 encodeURIComponent 使用的是 UTF-8 编码规则来编的.
如果 request.getParameter(paramName) 时,容器也按 UTF-8 解的话,是正确的. 根本无须在客户端
进行二次的 encodeURIComponent(...)
如果 request.getParameter(paramName),容器没有按 UTF-8 解的话, 结果只有一个,就是乱码
!
容器按什么编码来解码,决定于 request.setCharacterEncoding(***) 或者 服务器程序配置.
如果你在 jsp 程序中,能够 request.setCharacterEncoding("UTF-8"), 并且 修改服务器配置,让容器在解 GET 提交的参数时,使用 UTF-8.
客户端提交前不用二次编码, 接收时,也只要直接 request.getParameter(paramName) 即可
---------------------
为什么网上会有人提出在客户端对字符串重复编码两次呢.
如果因为项目需要,不能指定容器使用何种编码规则来解码提交的参数, 比如:需要接收来自不同页面,不地编码的参数内容时。 (又或者是开发人员被这有点复杂的东东搞得晕头转向,不懂得如何正确的去做好这接收参数的工作)
这个时候,在客户端对参数进行二次编码,可以有效的避开
“提交多字节字符
”的这个棘手问题。
因为第一次编码,你的参数内容便不带有多字节字符了,成了纯粹的 Ascii 字符串。(这里把编第一次的结果叫成 [STR_ENC1
] 好了。[STR_ENC1] 是不带有多字节字符的)
再编一次后,提交,接收时容器自动解一次 (容器自动解的这一次,不管是按 GBK 还是 UTF-8 还是 ISO-8859-1 都好,都能够正确的得到 [STR_ENC1])
然后,再在程序中实现一次 decodeURIComponent (Java中通常使用 java.net.URLDecoder(***, "UTF-8")) 就可以得到想提交的参数的原值。
使用 <form>...</form> 提交的,浏览器会自动编码一次.
ajax 提交的,需要自己手动编码。
---------------------
为什么要连续两次调用
encodeURI(String)
方法呢?是因为
Java
中的
request.getParameter(String)
方法会进行一次
URI
的解码过程,调用时内置的解码过程会导致乱码出现。而
URI
编码两次后,
request.getParameter(String)
函数得到的是原信息
URI
编码一次的内容。接着用
java.net.URLDecoder.decode(String str,String codename)
方法,将已经编码的
URI
转换成原文。
相关文章推荐
- ajax自动检测之中文编码(encodeURIComponent )
- JSP、AJax中文乱码问题解决,escape(), encodeURI(), encodeURIComponent(),js对参数连续两次调用 encodeURI(String) 方法
- 中文乱码 ajax使用encodeURIComponent()或encodeURI()编码 location.herf编码两次
- JSP、AJax中文乱码问题解决,escape(), encodeURI(), encodeURIComponent(),js对参数连续两次调用 encodeURI(String) 方法
- encodeURIComponent编码后java后台的解码 (AJAX中文解决方案)
- jsp传中文乱码问题 encodeURIComponent()编码方法
- encodeURIComponent编码 URLDecoder.decode解码乱码的问题
- JS 字符串编码函数(解决URL特殊字符传递问题):escape()、encodeURI()、encodeURIComponent()区别详解
- JS 字符串编码函数(解决URL特殊字符传递问题):escape()、encodeURI()、encodeURIComponent()区别详解
- 一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码:
- javascript 中的URL 编码问题! encodeURI, encodeURIComponent 如何使用
- 与PHP交互中文编码的几个函数 decodeURIComponent,encodeURIComponent,encodeURI,decodeURI
- JS 字符串编码函数(解决URL特殊字符传递问题):escape()、encodeURI()、encodeURIComponent()区别详解
- 前台用js的encodeURIComponent对中文编码,后台正确获取值的方法
- encodeURIComponent编码 URLDecoder.decode解码乱码的问题
- encodeURI与encodeURIComponent方法的区别 如果你使用的get方法提交表单肯定要考虑到输入项目的编码解码问题。 解决这个问题大家一般都使用encodeURI或者en
- decodeURI解码,由URIEncoder.encode("","GBK")编码的中文,问题解决
- encodeURIComponent编码 URLDecoder.decode解码乱码的问题
- 使用escape、encodeURI 和 encodeURIComponent 解决url中文乱码问题
- 前台使用js的encodeURIComponent编码后,java解析乱码问题的解决方法