Kawanet Blog III

川崎有亮(かわさきゆうすけ)のブログです。はてなに引っ越してきました。

unescape - ページ中の&#xHHHH;や\uHHHHのエスケープを展開するブックマークレット

特に海外の API のレスポンスで、2バイト文字が &#xHHHH; とか \uHHHH といった形式にエスケープされていて、中身が読めずに面倒なことって、ありますよね。それをブラウザ上で展開してくれるブックマークレットを書いてみた。

unescape

上記のリンクを、リンクバー等にドラッグ&ドロップしてから使います。
とりあえず↑をクリックするだけでも、↓で動作を試せます。 

 

利用例(1)XML 等で使われる &#xHHHH;&#DDDDD; 等に対応

<title>&#24536;&#24180;&#20250;&#12398;&#21442;&#21152;&#32773;&#24773;&#22577;</title>

<title>忘年会の参加者情報</title>

 

利用例(2)JSON 等で使われる \uHHHH に対応 

"message": "\u4eca\u65e5\u8a95\u751f\u65e5(*^_^*)\n22\u6b73\u304b\u3041\u301c(>_\u003C)\n",

"message": "今日誕生日(*^_^*)\n22歳かぁ〜(>_\u003C)\n",

 

ただし、< > " ' などは念の為にエスケープされたまま残します。
%HH の URL エンコードのデコードには対応していません。
ソースコードは以下の通り。

 

var cache = {};
var regex = /\\u[0-9a-f]{4}|\&(\w+|\#([0-9]+|x[0-9a-f]+))\;/g;
var ignore = /[\x00-\x20\>\<\&\"\']/;
var func = function (match) {
  var ret = cache[match];
  if (! ret) {
    var head = match.charAt(0);
    if (head == "&") {
      var p = document.createElement("p");
      p.innerHTML = match;
      ret = p.firstChild ? p.firstChild.data : match;
    } else {
      var src = match.substr(2, 4);
      var cd = parseInt(src, 16);
      ret = String.fromCharCode(cd);
    }
    if (ret.match(ignore)) ret = match;
    cache[match] = ret;
  }
  return ret;
};

var walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT);
while(walker.nextNode()) {
  var src = walker.currentNode.data;
  if (! src) continue;
  var dst = src.replace(regex, func);
  if (src != dst) walker.currentNode.data = dst;
}


未だに US-ASCII しか考慮しない人・環境には、エスケープした方が安全なのだろうけど。。。