2016-04-23 14 views
1

jsでフロントエンドアプリケーションを作成しようとしていますが、Webサーバーから自分のデータ(I assignU \ n)を取得しています。特殊文字が含まれていると、gzcompressの文字列を解凍すると間違った結果が返されます

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

Webサーバ:

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

はfalseを返し、

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

のようなものは機能しません。

通常の文字列で正常に機能するので、解凍が問題である必要がありますが、解凍に何が問題なのか分かりません。

+0

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

答えて

0

JavaScriptで文字列リテラルが\nの場合は、新しい行を示します。コンソールにこのような文字列を記録すると、複数の行に分割されて表示されます。
デコードされた文字列のログを見てみると、その行は1行でわかります。

これは、元の文字列に改行がないことを意味します。
あなたのPHPから、あなたはそれを非常にはっきりと見ることができます。 phpでは、エスケープスラッシュは一重引用符で囲まれたPHP文字列でエスケープするため、\nは改行を表すために二重引用符で囲む必要があります。

<?php 
    print($compressed = base64_encode(gzcompress("I\u2764U\n\uD83D\uDE18\uD83D\uDE18\uD83D\uDE18", 6))); 
関連する問題