【Delphi】JavaScript 调用 Delphi 的 Base64 编码,汉字乱码解决方法

22 篇文章 3 订阅

在用Delphi开发后台,对字符串进行Base64后,前端通过JavaScript解码是会出现如下问题(注意:只有Delphi编码,javascript解码会出现这个问题,如果解码也是Delphi就没有问题):

  1. 汉字乱码
  2. 空格解码后变成 + 号

本文中使用的编码前样例数据为:深圳 ShenZhen 123

出现上述问题的Delphi代码如下:

S := TNetencoding.Base64.Encode(Str);

样例数据:

编码前编码后
深圳 ShenZhen 1235rex5ZyzIFNoZW5aaGVuIDEyMw==

javascript的解码代码如下(如果引用三方库解码,我没有测试,下面是原生解码):

let decodedData = window.atob(JSONStr);

样例数据:

解码前解码后(乱码)
5rex5ZyzIFNoZW5aaGVuIDEyMw==

æ·±å³ ShenZhen 123

解决汉字乱码问题,就是需要将字符串在Base64前先给其进行URL编码,然后在进行Base64编码,这样在javascript中也要进行相反的操作(先进行Base64解码,然后在进行URL解码),具体的代码如下:

Delphi代码:

  //首先进行URL编码
  S  := TNetEncoding.URL.Encode(Str);
  //进行Base64编码
  JSONStr := TNetencoding.Base64.Encode(S);

样例数据:

编码前编码后
深圳 ShenZhen 123JUU2JUI3JUIxJUU1JTlDJUIzK1NoZW5aaGVuKzEyMw==

javascript代码:

//Base64 解码
let decodedData = window.atob(JSONStr);
//URI解码
let decodedData1 = decodeURIComponent(decodedData);

样例数据:

解码前解码后(无乱码)
JUU2JUI3JUIxJUU1JTlDJUIzK1NoZW5aaGVuKzEyMw==

深圳+ShenZhen+123

通过以上代码,汉字乱码的问题就不存在了,但是如果编码前的原字符串数据中有空格(本样例数据中汉字和字符间有空格,字符和数字间有空格),通过上述代码后,javascript解码后会将空格变成 + 号,这是不正确的。解决的办法是修正Delphi端的Base64编码方式。

Delphi 代码:

  //首先进行URL编码
  S  := TNetEncoding.URL.Encode(Str,[],[]);  //这里取消将空格不作为+号处理
  //进行Base64编码
  JSONStr := TNetencoding.Base64.Encode(S);

样例数据:

编码前编码后
深圳 ShenZhen 123JUU2JUI3JUIxJUU1JTlDJUIzJTIwU2hlblpoZW4lMjAxMjM=

javascript代码不用调整,就可以正确解码,空格也不会变成 + 号。

解码前解码后
JUU2JUI3JUIxJUU1JTlDJUIzJTIwU2hlblpoZW4lMjAxMjM=深圳 ShenZhen 123 

本文是在开发项目中遇到的坑,希望对遇到这个坑的朋友有帮助!

演示程序含原代码下载​​​​​​​

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海纳老吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值