JavaVMに独自のCharsetを追加する

NIOには、独自のCharsetを追加することができる機能があるということはかなり前から知っていましたが試したことがありませんでした。

初めて聞いたのは1.4.0がリリースされたころであり、その時はNIO関連のAPIのみしか利用できないという話を聞いていたので*1使えない機能だと思っていました。最近、 JIS X 0213:2004のサポートされたということもあり、またJavaVMの内部実装も1.4から変わっているので調べてみました。

幸いサンプルコードは、数少ないNIOの書籍である「Java NIO」書籍サイトから取得することができますのでこのサンプルやVMのコードをチェックすることで実装や動きを確認することができます*2

独自にCharsetを作成する際のポイントは、

  1. 独自のCharsetクラスとCharsetProviderクラスを作成する必要がある*3
  2. 作成したクラスをパッケージ化したjarファイルにMETA-INF/services/java.nio.charset.spi.CharsetProviderというファイルを作成しそのファイルの中にパッケージ名を付加したCharsetProviderクラスを記述する必要がある
  3. プロバイダが変更されるのではなく追加されるのでデフォルトのCharsetももちろん使える

試したJava6だとStringクラスからバイト配列を取得する際にも文字列を指定するだけで動作するので、制限なく利用できることがわかれば、日本独自のメインフレーム文字コードや携帯ベンダーの文字コード向けのコードをOSSで公開すると利用者は意外といるかもしれません。

*1:実際に使えなかったかは未確認です

*2:http://javanio.info/

*3:必要に応じて、CharsetDecoder,CharsetEncoderも実装する必要があるかと思います