egg项目在ie浏览器下,中文路径参数乱码的问题

在此次项目的开发中,因为在路径参数中带有中文,发现在出ie以及window10下的默认浏览器,路径参数中带有中文,在contrller中的获取,拿到的是一串乱码

原因:浏览器在传输URl时得对URL进行编码,不同浏览器对于路径参数的解析不一样,ie是按照utf-8来解析,像chorme则是按gbk来解析,
而后台的解析是按照iso-8859-1编码来进行解析

解决方式:

  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");

路径的编码解码

参考文档1
参考文档2

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

  1. 不清楚在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值