【问题标题】:Decode back Javascript base64 unicode with PHP使用 PHP 解码回 Javascript base64 unicode
【发布时间】:2017-04-04 03:35:11
【问题描述】:

我在 Javascript 中有这个编码函数:

function b64EncodeUnicode(str) {
    return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
        return String.fromCharCode('0x' + p1);
    }));
}

PHP下如何解码?

我试过了:

htmlspecialchars_decode(base64_decode($str));

但我得到了一个贬值的字符,例如:

�]��\��H���

你能建议一个解决方案吗?

编码的 html 代码示例:

<div class="pattern">
  <div class="gbody"></div>
  <div class="eyes">
    <div class="eye left"></div>
    <div class="eye right"></div>
  </div>
  <div class="mouth"></div>
  <div class="wave"></div>
  <div class="gshadow"></div>
</div>

javascript 返回:

CiAgPGRpdiBjbGFzcz0iZ2JvZHkiPjwvZGl2PgogIDxkaXYgY2xhc3M9ImV5ZXMiPgogICAgPGRpdiBjbGFzcz0iZXllIGxlZnQiPjwvZGl2PgogICAgPGRpdiBjbGFzcz0iZXllIHJpZ2h0Ij48L2Rpdj4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJtb3V0aCI PC9kaXY CiAgPGRpdiBjbGFzcz0id2F2ZSI PC9kaXY CiAgPGRpdiBjbGFzcz0iZ3NoYWRvdyI PC9kaXY CjwvZGl2Pg==

这里是Javascript中的解码函数:

function b64DecodeUnicode(str) {
    return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) {
        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
    }).join(''));
}

编辑:

str带汉字:

CiAgPGRpdiBjbGFzcz0iZ2JvZHkiPjwvZGl2PgogIDxkaXYgY2xhc3M9ImV5ZXMiPgogICAg5Lq65rCR6ZOB6YGT572R5piv55Sx5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu96ZOB6YGT6YOo5pS/5rK76YOo5a6j5Lyg6YOo5Li7566h44CB5Lq65rCR6ZOB6YGT5oql56S+5Li75Yqe44CB5oOf5LiA6I635b6X5Zu95Yqh6Zmi5paw6Ze75Yqe5om55YeG55qE5YW35pyJ5paw6Ze75Y+R5biD6LWE6LSo55qE6ZOB6Lev6KGM5Lia572R56uZ77yM5Lq65rCR6ZOB6YGT572R56uL6Laz6ZOB6LevCiAgICA8ZGl2IGNsYXNzPSJleWUgbGVmdCI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJleWUgcmlnaHQiPjwvZGl2PgogIDwvZGl2PgogIDxkaXYgY2xhc3M9Im1vdXRoIj48L2Rpdj4KICA8ZGl2IGNsYXNzPSJ3YXZlIj48L2Rpdj4KICA8ZGl2IGNsYXNzPSJnc2hhZG93Ij48L2Rpdj4KPC9kaXY

注意:我的项目需要Javascript编码功能。

【问题讨论】:

  • 一个$str 的例子会很好
  • 一段很长的html代码......你可以尝试任何文本进行测试。
  • 我放了一个用Javascript编码的字符串的例子。
  • 你看到 base64 编码字符串中的那些空格了吗?
  • 我用 javascript 解码函数编辑了我的问题 ...

标签: javascript php unicode


【解决方案1】:

这对我来说非常适合:

function decodeSpacedB64($b64) {
    return htmlspecialchars_decode(base64_decode(str_replace(' ', '+', $b64)));
}

echo decodeSpacedB64(/* ...your_string... */);

您可能已经注意到您的字符串中有空格,因此,如果您希望标准 php base64_decode() 函数能够解码您的字符串,则应该用加号替换它们。

更新

提问者声称使用base64_decode() 无法解码俄语和中文。这完全不是真的:

第 1 步(JS)

function b64EncodeUnicode(str) {
    return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
        return String.fromCharCode('0x' + p1);
    }));
}

var str = b64EncodeUnicode("проверка связи");
console.log(str); // outputs "0L/RgNC+0LLQtdGA0LrQsCDRgdCy0Y/Qt9C4"

第 2 步 (PHP)

echo htmlspecialchars_decode(base64_decode("0L/RgNC+0LLQtdGA0LrQsCDRgdCy0Y/Qt9C4"));
// outputs "проверка связи"

可能提问者的系统中的控制台编码存在问题(实际上,使用不同于 UTF-8 的编码会导致垃圾而不是文本)。

【讨论】:

  • OP 的问题是他在将字符串传递给 php 时破坏了字符串。这可以解决症状,但不能解决问题。
  • 请看一下javascript decode函数看看这个过程,我需要把它转换成PHP。
  • @Federkun,你是对的,OP 似乎不理解它。但我相信,在某些情况下,您别无选择,只能使用一种解决方法(例如不受您控制的纯粹设计的前端)。但总的来说,是的,最好的解决方案是解决问题而不是结果。
  • 标准 base64 解码/编码不适用于中文、俄文和印度文字符...我的问题是基于此。将javascript函数转换为php。
  • 它确实有效,我刚刚检查过:echo htmlspecialchars_decode(base64_decode("0L/RgNC+0LLQtdGA0LrQsCDRgdCy0Y/Qt9C4")); 它输出俄语проверка связи。 (Base64 编码的字符串是从b64EncodeUnicode 接收的)。
【解决方案2】:

base64_decode 就够了。您的问题(可能)是您如何将 js-base64encoded 字符串发送到 php。

b64EncodeUnicode 不能返回这个:

CiAgPGRpdiBjbGFzcz0iZ2JvZHkiPjwvZGl2PgogIDxkaXYgY2xhc3M9ImV5ZXMiPgogICAgPGRpdiBjbGFzcz0iZXllIGxlZnQiPjwvZGl2PgogICAgPGRpdiBjbGFzcz0iZXllIHJpZ2h0Ij48L2Rpdj4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJtb3V0aCI PC9kaXY CiAgPGRPdiBjbGFzcz0id2F2ZSI PC9kaXY CiAgPGRpdiBjbGFzcz0iZ3NoYWRvdyI PC9kaXY CjwvZGl2Pg==

你看到空格了吗? b64EncodeUnicode 可能会返回这个:

CiAgPGRpdiBjbGFzcz0iZ2JvZHkiPjwvZGl2PgogIDxkaXYgY2xhc3M9ImV5ZXMiPgogICAgPGRpdiBjbGFzcz0iZXllIGxlZnQiPjwvZGl2PgogICAgPGRpdiBjbGFzcz0iZXllIHJpZ2h0Ij48L2Rpdj4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJtb3V0aCI + PC9kaXY + CiAgPGRpdiBjbGFzcz0id2F2ZSI + PC9kaXY + CiAgPGRpdiBjbGFzcz0iZ3NoYWRvdyI + PC9kaXY + CjwvZGl2Pg == P>

您需要做什么来解决您的问题?例如,如果你在 php 页面的查询字符串中传递它,你应该对它进行 url 编码。你可以使用encodeURIComponent来做。

【讨论】:

  • 我想从 PHP 中解码,请看 JAVASCRIPT 中的解码函数...不是标准的解码函数。
  • 不重要,因为btoa函数不支持汉字等特殊字符...
  • 已经尝试过了,但没有好的结果,我只有这个解决方案:developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
  • 一个带有中文字符的 HTML 代码,俄语,印度语也不起作用。
  • 3v4l.org/Bh5SZ - 您是否阅读了 utf-8 编码的内容? (在顶部放一个header('Content-Type: text/html; charset=utf-8');
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 2020-09-25
  • 2016-05-08
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多