Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
37
Help us understand the problem. What is going on with this article?
@kjunichi

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

More than 3 years have passed since last update.

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

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」と分かってからは、類似の情報は容易に見つかった。

関連記事

37
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
kjunichi
WebRubyがきっかけで、mrubyで実装されたhttp2サーバーのtrusterdに絡んだ事をやってみたり、ElectronのIssue眺めたり、手元で動かしたり、node.js関連。WASMも少々。投稿する記事の内容は個人の意見であり、所属する企業の見解を代表するものではありません。
japan-systems
「2019年に50周年を迎えたIT企業です。最先端の技術により全国の企業、官公庁、自治体に多くの実績があります。」

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
37
Help us understand the problem. What is going on with this article?