LoginSignup
42
38

More than 5 years have passed since last update.

JSONPで受け取れない文字? \u2028

Last updated at Posted at 2013-02-19

半日以上かかってしまった!

JSONPで返却する文字列に\u2028が含まれているとブラウザで
扱えない模様。

任意のURLを指定するとその内容をJSONPで返していたのだが、
特定のページがなぜかエラーとなってしまい、原因に時間がかかった。

JSON.stringifyすりゃ、デコード絶対出来るものと思い込んでいた

ちなみに、JSON.stringifyしてJSONPで返す文字列を作成していたので、
余計に時間がかかった気がする。

どんなエラーが出るのか?

Chromeでは

Uncaught SyntaxError: Unexpected token ILLEGAL 

Firefoxでは

SyntaxError: unterminated string literal 

\u2028のほか\u2029も問題になる模様

2014/10/25追記

コメントでご指摘いただき、改めて分かりづらかったので、
コードでどんな事だったかを残しておきます。

function callback(obj) {
    console.dir(obj);
}

function myEscape(str) {
    //return str;
    return str.replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
}

var cb = "callback(" + myEscape(JSON.stringify(["\u2028", "\u2029"])) + ")";
console.log(cb);

var s = document.createElement("script");
s.innerHTML = cb;
document.body.appendChild(s);

// myEscapeで\u2028,\u2029をエスケープしないと後処理でエラーになる。
// 実際のケースでは、JSONPで受けた側でコールバック実行直前でエラーとなる。
cb = "callback(" + myEscape(JSON.stringify(["b\u2028a", "d\u2029c"])) + ")";
console.log(cb);

s = document.createElement("script");
//本来はここでsrc属性にJSONP対応のWebAPIを指定する。
s.innerHTML = cb;
document.body.appendChild(s);

Runstantでこれを動かせるようにしておきました。

関連するリンク

原因が「\u2028」と分かってからは、類似の情報は容易に見つかった。

関連記事

42
38
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
38