全部の文字をUTF-8にエスケープする関数

charCodeAtはUTF-16BEを返すっぽい。ブラウザのURL欄に

javascript:alert("あ".charCodeAt(0).toString(16))

と入れてエンターを押すと、「3042」という数字が出ると思う。(Firefox2.0.0.3, IE6で確認しました)

ASCII文字だろうがなんだろうが、全部UTF-8にエスケープする関数を作ろうと思った。文字列を分割して、charCodeAtで変換すればいいだけかと思ったら、charCodeAtがUTF-16BEのコードを返すのでちょっと手を入れなければいけなかった。

function escapeUTF8(page_name){
	var escaped_name = String(), c;
	for(i=0;i<page_name.length;++i){
		c = page_name.charCodeAt(i);
		if ((c >= 0x0001) && (c <= 0x007F)) {
			escaped_name += "%"+c.toString(16);
		} else if (c > 0x07FF){
			escaped_name += "%"+(0xE0 | ((c >> 12) & 0x0F)).toString(16);
			escaped_name += "%"+(0x80 | ((c >> 6) & 0x3F)).toString(16);
			escaped_name += "%"+(0x80 | ((c >> 0) & 0x3F)).toString(16);
		} else {
			escaped_name += "%"+(0xC0 | ((c >> 6) & 0x1F)).toString(16);
			escaped_name += "%"+(0x80 | ((c >> 0) & 0x3F)).toString(16);
		}
	}
	return escaped_name;
}

ちなみに escapeUTF8 ではアルファベットは小文字。大文字にしたいのなら toUpperCase() にかければよい。
高度な JavaScript 技集UTF-8 , UTF16 変換ライブラリを参考にさせていただきました。多謝。

ちなみにデコードは decodeURI や decodeURIComponent で行なえる。ただしdecodeURIでは一部文字列(「&」、「,」、「/」など)がデコードされないのを確認済み。decodeURIComponentではASCII文字コード内の文字も全てデコードできた。

test