Unicode ⇔ UTF-8バイト列なコード

vs UTF-8, UTF-16, UCS4 - 枕を欹てて聴くを読んだは良いけどやってみないと良く分からん>< あ〜んど

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

は買ってあるけどきちんと読んでないなあ
ということで、本のほうを見ながらUnicodeの変換をやってみた。

やったのは

正直正常系しか試してないので正しいコードか分からないけど、UTF-8の4バイト文字が可逆変換できたので良しとしている。

勉強になったこと

もちろん、変換方法の勉強になったのだけど。
String#charCodeAtとかString#lengthがどういうものなのかというのが収穫だった。

例えば、UTF-8で4バイト文字の𠀋(U+2000B)でいうと。

"𠀋".length; // 2
"𠀋".charCodeAt(0); // 55360 = 0xD840
"𠀋".charCodeAt(1); // 56331 = 0xDC0B

と一文字なのに長さは2と返ってくる。
んで、これって、UTF-16サロゲートペアなわけですよ。String#lengthってどうやらUTF-16換算した時のバイト数らしいぞ、と。
本を読んでいくと、Unicode符号位置の 0x00FFFF 以下ならそのままUTF-16なんだけど、0x010000 〜 0x10FFFF は2バイトで表現できないのでサロゲートペアで表現するみたい。ついでに、String.fromCharCodeで数値から文字に変換するにもUTF-16String.fromCharCode(0xD840, 0xDC0B)とするみたい。(第二引数を指定できるとここではじめて知った)

そして、String#charCodeAtUTF-16のn番目のバイトの数値を得るメソッドだということが分かった。

あと、ビット演算にちょっと強くなった気がする。