JDK1.1では文字を Unicode と呼ばれるコードで取り扱います。
これは SJIS や EUC などのコードとは異なるものです。
Calendar のオブジェクトから取り出して整形した文字列のオブジェクト
などは、既に Unicode ですから、そのままで正しく表示されます。
また、アプレットのパラメータとして渡された文字列も、
アプレットに渡された段階で Unicode に自動的に変換されますから、
見かけ上は何もしなくても HTMLのテキストに記述された SJIS や EUC の
コードの文字列がそのまま表示されることになります。
JDK1.1 ではバイト配列と JavaのUnicode の char型配列の
間を変換するためのクラスが java.io パッケージに追加されています。
(ファイルから読み込んだ内容は SJIS や EUC のように2バイト一組の文字の列
であってもバイト配列と見なすことができます。)
| クラス名 | 働き |
|---|---|
| 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