关于前端传参编码解码(endodeURI/encodeURIComponent)你真的了解吗?

29 阅读1分钟

使用场景

我们在前端页面调整之间,为了保存页面状态或实现特定显示效果,通常需要将整个对象作为参数进行传递,而url存在字符长度限制并且只允许限定的字符集,js对象是复杂数据类型,而url参数只允许字符串格式,因此需要对参数对象进行通过endodeURI/encodeURIComponent编码解码,像是这样:

   const params = encodeURIComponent(JSON.stringify(item));
     uni.navigateTo({
       url: `/pagesHome/swiperDetail/index?data=${params}`,
   });
   
   const item = JSON.parse(decodeURIComponent(options.data));

问题

上面的编码解码很简单,但是也存在一些问题,在公司最近的迭代开发中出现了一个bug,大概情况是这样:我有一个菜品列表页面,点击页面card可以跳转到相关详情,绝大多数card进入都没有报错问题,单单某个页面会报错阻塞,起初我十分疑惑,但在排查后发现是编码解码的问题,大家知道原因吗?

解决

我通过比对有问题的card和没问题的card,发现有问题的card数据展示上存在特殊表情字符,我猜测这正是原因所在,估计是编码解码范围的问题,同时想起来编码解码存在两个方法即endodeURI/encodeURIComponent,然后就去搜索了两个编码解码方法的范围,发现确实如此encodeURIComponent的编码解码范围比encodeURI大的多,encodeURI的范围不包括某些特殊的表情字符集,而encodeURIComponent的编码解码范围则能涵盖大多表情字符集。随后我便把项目中的encodeURI全部换成了encodeURIComponent。

对比encodeURI、encodeURIComponent

encodeURI:

  1. 编码范围小,对字符串进行URI 编码,该方法不会对 ASCII 字母和数字进行编码,也不会对具有特殊含义的 ASCII 标点符号,如: :;/?:@&=+$,# - _ . ! ~ * ' ( )进行编码
  2. 性能消耗相对encodeURIComponent小

encodeURIComponent:

  1. 编码范围小,对字符串进行URI 编码,该方法会对 ASCII 字母和数字进行编码,也会对具有特殊含义的 ASCII 标点符号,如: :;/?:@&=+$,# - _ . ! ~ * ' ( )进行编码
  2. 性能消耗相对encodeURI大