当涉及特殊字符时,解压缩字符串(来自gzcompress)会返回错误的结果

时间:2016-04-23 18:40:15

标签: javascript

我正在尝试在js中编写前端应用程序,我从网络服务器获取数据(I❤U\ n)。

jsFiddle https://jsfiddle.net/czmovg26/1/

网络服务器:

<?php
    print($compressed = base64_encode(gzcompress('I\u2764U\n\uD83D\uDE18\uD83D\uDE18\uD83D\uDE18', 6)));
?>

前端:

var b64Data = "eJzzjCk1MjczCY3Jiyl1sTB2AZKuhha42ABGUQ2i"; // === I❤U\n

// Decode base64 (convert ascii to binary)
var strData = atob(b64Data);
// Convert binary string to character-number array
var charData = strData.split('').map(function (x) {
    return x.charCodeAt(0);
});
// Turn number array into byte-array
var binData = new Uint8Array(charData);
// Pako magic
var data = pako.inflate(binData);
// Convert gunzipped byteArray back to ascii string:
var decoded = String.fromCharCode.apply(null, new Uint8Array(data));

var r = /\\u([\d\w]{4})/gi;
decoded = decoded.replace(r, function(match, grp) {
  return String.fromCharCode(parseInt(grp, 16));
});
decoded = unescape(decoded);

现在,当您在控制台中打印字符串时字符串看起来相同,但是

console.log(decoded == "I❤U\n");

恢复虚假,等等

var val = decoded.replace(RegExp("\n","g"), "<br>");

不起作用。

解压缩必定是问题,因为它可以正常使用普通字符串,但我不明白,解压缩有什么问题。

1 个答案:

答案 0 :(得分:0)

在JavaScript中,其中带有\n的字符串文字表示一个新行,如果您要将这样的字符串记录到控制台,您会看到它沿多行分开。
如果您查看已解码字符串的日志,您会在单行上注意到它。

这意味着您的原始字符串中没有新行。
从你的PHP你可以非常清楚地看到。在php中,转义斜杠只转义单引号php字符串中的单引号,因此\n代表换行符时必须在双引号字符串中。

<?php
    print($compressed = base64_encode(gzcompress("I\u2764U\n\uD83D\uDE18\uD83D\uDE18\uD83D\uDE18", 6)));