JavaでのUnicode補助文字

unicodeの文字数を数える - YHR’s notesの続き、ですが、

Sunのドキュメント 
Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle
にあるように、J2SE 5.0からUnicodeの補助文字がサポートされるようになりました。
簡単に言うと、

  • 従来Javaでの文字データの扱いはUTF-16をそのまま16ビットで表現していた
  • 補助文字は16ビットで表現しきれない部分を指し、32ビットで表現する
    • 16ビットで表せる文字が二文字で32ビットの場合と、補助文字一文字で32ビットの場合を区別できるように、UTF-16の上位ビット領域は予約済みであった
    • すなわち、補助文字も含めて、予約済み上位ビット領域を除いた本質的なデータ量は一文字あたり16ビットで収まる
  • 補助文字を扱えるよう、低レベル、高レベル、描画API等が整備された


で、使う側とすればどうなのか。たぶん、補助文字を明示的に扱う場合以外は、文字列長だけが問題であろうと思われます。つまり、外部からの入力文字列に知らないうちに補助文字が入り込んでいる場合、CharBuffer以外のCharSequence実装高レベルAPIでは、文字数カウントには
.length()
ではなく
.codePointCount()
を使う必要があります。charでやるならば直接補助文字を探知するようサロゲート(前述の上位ビット領域)を扱うメソッドでみてやる必要がありそうです。



コード内で補助文字を直接扱う(比較等)必要がある場合は、対応するなんちゃらcodePointなんちゃらというようなメソッドをつかうことになります。