Unicode ⇔ UTF-8バイト列なコード
vs UTF-8, UTF-16, UCS4 - 枕を欹てて聴くを読んだは良いけどやってみないと良く分からん>< あ〜んど
プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)
- 作者: 矢野啓介
- 出版社/メーカー: 技術評論社
- 発売日: 2010/02/18
- メディア: 単行本(ソフトカバー)
- 購入: 34人 クリック: 578回
- この商品を含むブログ (129件) を見る
ということで、本のほうを見ながら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-16でString.fromCharCode(0xD840, 0xDC0B)
とするみたい。(第二引数を指定できるとここではじめて知った)
そして、String#charCodeAtもUTF-16のn番目のバイトの数値を得るメソッドだということが分かった。
あと、ビット演算にちょっと強くなった気がする。