Javaにおける日本コード

日本語を表示するボタンのサンプルを紹介します。
JDK1.1では文字を Unicode と呼ばれるコードで取り扱います。 これは SJIS や EUC などのコードとは異なるものです。 Calendar のオブジェクトから取り出して整形した文字列のオブジェクト などは、既に Unicode ですから、そのままで正しく表示されます。 また、アプレットのパラメータとして渡された文字列も、 アプレットに渡された段階で Unicode に自動的に変換されますから、 見かけ上は何もしなくても HTMLのテキストに記述された SJIS や EUC の コードの文字列がそのまま表示されることになります。
 しかし SJIS や EUC のファイルから読み込んだテキストは Unicode に変換する必要があります。 また、プログラム内で生成されたテキストを標準出力やファイルに出力する 場合にも、逆に Unicode から SJIS や EUC への変換が必要となります。
 また、ソースファイルの中に直接記述する文字列(たとえば Stringの オブジェクトを生成する時に"" 内に与える文字列は、 当然 Unicode でなくてはいけませんが、既存のエディタの多くは Unicodeに対応しているわけではありません。 この問題は Javaで書かれた優れたエディターや開発ツールが登場してくれば 自然に解決するかもしれませんが、当面は不便でしょう。 ここでは、プログラム内で EUC の文字列を与え、 それを Unicode に変換することを考えてみます。

JDK1.1 ではバイト配列と JavaのUnicode の char型配列の 間を変換するためのクラスが java.io パッケージに追加されています。 (ファイルから読み込んだ内容は SJIS や EUC のように2バイト一組の文字の列 であってもバイト配列と見なすことができます。)

byte配列と Unicode char配列を変換するクラス
クラス名 働き
ByteToCharConverter バイト列を元に Unicode に変化された char配列を生成する
CharToByteConverter Unicode の char配列を元に、特定の文字コードに変換されたバイト列を生成する

上記の2つのクラスは、当然システムが使用する文字コードに 依存した実装部分を持ちます。 そのため、クラス名は同じままでオブジェクトを手に入れ、 ソースコードの互換性を保つ工夫がされています。 コンストラクタではなく、クラスに用意されたメソッド getDefault() によって、システムごとに用意された Conveter のオブジェクトを得ることが できます。 また、複数の文字コードを同時に取り扱うアプリケーション (たとえばWebブラウザなど)のために明示的に使用するコードを 指定することも可能です。この場合は getConverter() を用います。 このあたりの仕組みは Locale の指定と同じです。


ByteToCharConverter defConv, eucConv;
defConv = ByteToCharConverter.getDefault();  // システムの文字コードとの変換
eucConv = ByteToCharConverter.getConveter("EUCJIS");    // EUCコードとの変換

 さて、ソース内に直接記述された文字列は char型配列に保存されることに なりますが、この場合 SJIS や EUC の各バイトが Javaの char の1つのデータ (2バイト)に対応します。 したがって、いったん char型の配列の下位バイトのみを取り出してバイト配列に 格納し直し、そのバイト配列を Unicode に変換するというややこしい手順を踏む ことになります。


    /** 言語環境に対応した時刻表示に必要なオブジェクト */

       ByteToCharConverter b2c;    //システムの日本語コードから Unicodeへ 

    /** 文字列を記憶するオブジェクト */

       byte buf[];
       char cha1[];
       char cha2[];
       String jstr;   // 日本語文字列
       String label;

    /** アプレットの初期設定を行うメソッド */

       b2c = ByteToCharConverter.getDefault();

       jstr = "象";   // 日本語文字列

       cha1 = new char[ jstr.length() ];
       jstr.getChars( 0, jstr.length(), cha1, 0 );
       buf = new byte[ jstr.length() ];
       for( int i=0; i<jstr.length(); i++ ) {
            buf[i] = (byte)cha1[i];
       }
       cha2 = new char[ jstr.length() ];
       try {
            cha2 = b2c.convertAll( buf );
       }
       catch( MalformedInputException e ){
              System.out.println( "Can not Convert" );
              System.exit(0);
       }
       label = new String( cha2 );  // Unicode の String