2016-04-23 6 views
1

Ich versuche, eine Front-End-Anwendung in js zu schreiben, und ich bekomme meine Daten (IU \ n) von einem Webserver.Dekomprimieren String (von gzcompress) gibt falsches Ergebnis zurück, wenn spezielle Zeichen beteiligt sind

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

Webserver:

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

Frontend:

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

Jetzt sieht die Zeichenfolge das gleiche, wenn Sie es in der Konsole zu drucken, aber

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

Resturns falsch, und Dinge wie

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

funktionieren nicht.

Die Dekomprimierung muss das Problem sein, wie es mit einer normalen Zeichenfolge funktioniert, aber ich verstehe nicht, was mit der Dekomprimierung falsch ist.

+0

'console.log (dekodiert ==" I❤U \\ n ");' –

Antwort

0

In JavaScript bezeichnet ein Zeichenkettenliteral mit \n darin eine neue Zeile. Wenn Sie eine solche Zeichenkette in die Konsole schreiben würden, würden Sie sehen, dass sie sich in mehrere Zeilen aufteilt.
Wenn Sie sich das Protokoll der entschlüsselten Zeichenkette ansehen, werden Sie es in einer einzigen Zeile sehen.

Das bedeutet, dass Ihre ursprüngliche Zeichenfolge keine neue Zeile enthielt.
Von Ihrem PHP können Sie das sehr deutlich sehen. In PHP entkommt der Escape-Schrägstrich nur dem einfachen Anführungszeichen in einer einzelnen PHP-Anführungszeichenfolge, so dass \n, um eine Newline darzustellen, innerhalb einer doppelten Anführungszeichenfolge sein muss.

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