在此次项目的开发中,因为在路径参数中带有中文,发现在出ie以及window10下的默认浏览器,路径参数中带有中文,在contrller中的获取,拿到的是一串乱码
原因:浏览器在传输URl时得对URL进行编码,不同浏览器对于路径参数的解析不一样,ie是按照utf-8来解析,像chorme则是按gbk来解析,
而后台的解析是按照iso-8859-1编码来进行解析
解决方式:
- 在传递参数之前,先进行一次编码,在获取参数是,在进行解码
例子:
JSP页:
var newUrl = "checkLogin/lessonClassList?userName=张三";
newUrl = encodeURI(newUrl);//编码
$("#dg").datagrid("options").url=newUrl;
$("#dg").datagrid("reload");
JAVA后台:
String name = request.getParameter("userName");
String u_name = java.net.URLDecoder.decode(name, "UTF-8");// 解码
u_name = new String(u_name.getBytes("iso-8859-1"), "utf-8");
路径的编码解码
encodeURI编码
decodeURI 解码
encodeURIComponent 编码组件
decodeURIComponent 解码组件
两者的区别:
- encodeURI:该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ’ ( ) 。
该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?😡&=+$,#
-
encodeURIcomponent:如果 URI 组件中含有分隔符,比如 ? 和 #,则应当使用 encodeURIComponent() 方法分别对各组件进行编码。
-
这些方法都是JavaScript 函数,也就是只能够在JavaScript中使用。
-
在service端解码,不使用decodeURI()和decodeURIComponent()的,可以使用fw = new String(fw.getBytes(“ISO-8859-1”), “UTF-8”);java语法,其他语言略有不同。
-
encodeURI不编码字符有82个:!,#,$,&,’,(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
-
encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z
- 不清楚在egg中controller的相关配置,故使用比较笨的方式,判断的当前拿到的参数是否是中文,之后再进行解码,算是初步解决自己遇到的问题。
import * as iconv from 'iconv-lite';
if (escape(this.queryParams.name).indexOf("%u") < 0) {
str = iconv.decode(this.queryParams.name, 'utf-8');
} else {
str = this.queryParams.name
}
此处用到的
escape 方法
escape对0-255以外的unicode值进行编码时输出%u****格式,其它情况下escape,encodeURI,encodeURIComponent编码结果相同。
escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z
最多使用的应为encodeURIComponent,它是将中文、韩文等特殊字符转换成utf-8格式的url编码,所以如果给后台传递参数需要使用encodeURIComponent时需要后台解码对utf-8支持(form中的编码方式和当前页面编码方式相同)
unescape 方法
从用 escape 方法编码的 String 对象中返回已解码的字符串。
function unescape(charString : String) : String