JS字符串转gb2312编码出现了问题

2024无限可能! 2021-04-17 03:05:17
在将字符串转gb2312编码出现了问题,比如这个字符串“一体机/小组6”,编码得到这个“%D2%BB%CC%E5%BB%FA%2F%D0%A1%D7%E96”,然后我用这串解码的时候,报错了
用的是这个方法:https://blog.csdn.net/bamuai7645/article/details/101082559
项目好急,然后又有bug,求助各位大佬!!!
...全文
1024 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wubing1111 2021-04-21
  • 打赏
  • 举报
回复
一般encode和decode是一起用的,不知道你是不是只用了一个。
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。
  • 打赏
  • 举报
回复
引用 7 楼 泡泡鱼_ 的回复:
[quote=引用 6 楼 苪玫儿呀 的回复:]写个方法出来吧,不好意思,不明白你说的
呃……就只是按你发你发的网址中,按上面说的,把加密那改一下。然后使用它加密你要的文本,再拿解密的去解你刚加密的文本应该就可以了 你上面说不行,你应该是直接拿的之前加密了的文本去解的吧?像你提问中的那个一样?那个是不行的。因为改过之后,加密后的文本不一样了的 你发的网址中那段代码,解密的时候,有两个步骤。先是都是按%[0-9A-F]{2}%[0-9A-F]{2}这样的格式,两个为一组,然后去和密文本中对照,取出来。过完一遍之后,再%[\w]{2}用decodeURIComponent直接解 但是,在加密的时候,对类似于/这样的,会给加密成%2F。然而当它只有一个“/”符号的时候,%2F它是符合解密第一个步骤的前一个格式的,当然它只有%2F,按%[0-9A-F]{2}%[0-9A-F]{2}这样的格式它还差一个%xx,因此,它会把后面那个原本由密文本生成的%aa%bb中的%aa拿出去,变成%2F%aa去参与解密。在你的问题中,它们就是“%2F%D0” 但密文本中没有它对应的值,所以%2F%aa被视为不在它的解密范畴,就放弃了。然后这一放弃,它多放弃了一个%aa,也打乱了原本的%aa%bb这一对以及后面所有能使用这个方法解密的文本。同时%aa也无法被decodeURIComponent()解密,因此,解密失败。像你例子中的就是decodeURIComponent('%D0'),这是解不了的 我上面说的改动,就是偷懒了一下,最快的改方法。就是对ascii码的,就保持原样输出。这样的话,在解密的时候,可以保证解密它不会意外干扰到由第一个加密方法生成的文本。才可以正常解密。当然,我也没有过多调试,有些场景没去考虑的 不过,你说你已经解决了,那就行了[/quote] 不过,还是要谢谢你~
泡泡鱼_ 2021-04-20
  • 打赏
  • 举报
回复
引用 6 楼 苪玫儿呀 的回复:
写个方法出来吧,不好意思,不明白你说的
呃……就只是按你发你发的网址中,按上面说的,把加密那改一下。然后使用它加密你要的文本,再拿解密的去解你刚加密的文本应该就可以了 你上面说不行,你应该是直接拿的之前加密了的文本去解的吧?像你提问中的那个一样?那个是不行的。因为改过之后,加密后的文本不一样了的 你发的网址中那段代码,解密的时候,有两个步骤。先是都是按%[0-9A-F]{2}%[0-9A-F]{2}这样的格式,两个为一组,然后去和密文本中对照,取出来。过完一遍之后,再%[\w]{2}用decodeURIComponent直接解 但是,在加密的时候,对类似于/这样的,会给加密成%2F。然而当它只有一个“/”符号的时候,%2F它是符合解密第一个步骤的前一个格式的,当然它只有%2F,按%[0-9A-F]{2}%[0-9A-F]{2}这样的格式它还差一个%xx,因此,它会把后面那个原本由密文本生成的%aa%bb中的%aa拿出去,变成%2F%aa去参与解密。在你的问题中,它们就是“%2F%D0” 但密文本中没有它对应的值,所以%2F%aa被视为不在它的解密范畴,就放弃了。然后这一放弃,它多放弃了一个%aa,也打乱了原本的%aa%bb这一对以及后面所有能使用这个方法解密的文本。同时%aa也无法被decodeURIComponent()解密,因此,解密失败。像你例子中的就是decodeURIComponent('%D0'),这是解不了的 我上面说的改动,就是偷懒了一下,最快的改方法。就是对ascii码的,就保持原样输出。这样的话,在解密的时候,可以保证解密它不会意外干扰到由第一个加密方法生成的文本。才可以正常解密。当然,我也没有过多调试,有些场景没去考虑的 不过,你说你已经解决了,那就行了
文盲老顾 2021-04-20
  • 打赏
  • 举报
回复
return str.replace(/%[0-9A-F]{2}%[0-9A-F]{2}/g,function(a){
                 if(a in G2Uhash){
                     return String.fromCharCode('0x'+G2Uhash[a]);
                 }else{
                     return a;
                 }
             })
// 稍微改造下
return str.replace(((?:%[8-9a-f][0-9a-f]){2}|%[0-7][0-9a-f])/gi,function(a){
                 if (a.length==3){
                     return String.fromCharCode(parseInt(a.replace('%',''),16));
                 }
                 else if(a in G2Uhash){
                     return String.fromCharCode('0x'+G2Uhash[a]);
                 }else{
                     return a;
                 }
             })
文盲老顾 2021-04-20
  • 打赏
  • 举报
回复
str.replace(/%[0-9A-F]{2}%[0-9A-F]{2}/g
// 把你复制代码中的这个正则修改下就好
'%D2%BB%CC%E5%BB%FA%2F%D0%A1%D7%E96'.match(/((?:%[8-9a-f][0-9a-f]){2}|%[0-7][0-9a-f])/gi)
区分下7位和8位就可以了,7位的直接 String.FromChatCode(parseInt('2F',16)),8位的继续用他自己的方法
  • 打赏
  • 举报
回复
写个方法出来吧,不好意思,不明白你说的
泡泡鱼_ 2021-04-19
  • 打赏
  • 举报
回复
引用 4 楼 苪玫儿呀 的回复:
[quote=引用 2 楼 泡泡鱼_的回复:]加密那: if(isAscii(code)){ // return encodeURIComponent(a);这句换成下面那句 return a; }
不过后面自己想到解决方法了[/quote] 让你改加密,就是说你加密和解密对不上。上面说的要拿去解密的就要用这个重新加过密。如果你要保持原有的加密文本不动,你只能优先处理ascii码的,再进行解密
  • 打赏
  • 举报
回复
引用 2 楼 泡泡鱼_的回复:
加密那: if(isAscii(code)){ // return encodeURIComponent(a);这句换成下面那句 return a; }
不过后面自己想到解决方法了
  • 打赏
  • 举报
回复
引用 2 楼 泡泡鱼_的回复:
加密那: if(isAscii(code)){ // return encodeURIComponent(a);这句换成下面那句 return a; }
这个不行哦
泡泡鱼_ 2021-04-17
  • 打赏
  • 举报
回复
加密那: if(isAscii(code)){ // return encodeURIComponent(a);这句换成下面那句 return a; }
  • 打赏
  • 举报
回复
URIError: URI malformed at decodeURIComponent (<anonymous>) at eval (gkb.js?b65e:61) at String.replace (<anonymous>) at Object.decode (gkb.js?b65e:60) at VueComponent.changeInputName (general-port.vue?fab9:350) at blur (general-port.vue?0983:131) at VueComponent.invoker (vue.runtime.esm.js?2b0e:2023) at VueComponent.Vue.$emit (vue.runtime.esm.js?2b0e:2534) at VueComponent.handleBlur (element-ui.common.js?5c96:5939) at invoker 报了这样子的错误

87,901

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧