2016-04-23 22 views
1

我正試圖在js中編寫一個前端應用程序,並且正從Web服務器獲取我的數據(I❤U\ n)。當涉及特殊字符時,解壓縮字符串(來自gzcompress)返回錯誤結果

的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>"); 

不起作用。

解壓縮必須是問題,因爲它可以正常工作,但我不明白,解壓出了什麼問題。

+0

'console.log(decoded ==「I❤U\\ n」);'' –

回答

0

在JavaScript中,一個帶有\n的字符串文本表示一個新行,如果您要將這樣的字符串記錄到控制檯,您將看到它沿多行分割。
如果你看看解碼後的字符串的日誌,你會注意到它在一行上。

這意味着您的原始字符串中沒有新行。
從你的PHP你可以看得很清楚。在PHP中,轉義斜槓只能在單引號php字符串中轉義單引號,因此對於\n來表示一個換行符,它必須位於雙引號字符串中。

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