unescape - ページ中の&#xHHHH;や\uHHHHのエスケープを展開するブックマークレット
特に海外の API のレスポンスで、2バイト文字が &#xHHHH; とか \uHHHH といった形式にエスケープされていて、中身が読めずに面倒なことって、ありますよね。それをブラウザ上で展開してくれるブックマークレットを書いてみた。
上記のリンクを、リンクバー等にドラッグ&ドロップしてから使います。
とりあえず↑をクリックするだけでも、↓で動作を試せます。
利用例(1)XML 等で使われる &#xHHHH; や &#DDDDD; 等に対応
<title>忘年会の参加者情報</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 しか考慮しない人・環境には、エスケープした方が安全なのだろうけど。。。