Fork me on GitHub

Conduit Java+conduitでの文字化け

  • Jun 02, 2006

categoryプラグインは存在しません。

Java Conduit では、いろんなところで文字化けが発生するのは良く知られてます。

私の把握している範囲では、以下の部分で文字化けが発生してました。

  • Conduit に渡されるパス名
  • Category クラスを使った場合のカテゴリ名
  • AbstractRecord クラスを使った場合のテキスト部分

まぁ言ってみれば、日本語の入る可能性のある部分全部です。

Conduit に渡されるパス名

パス名は、Shift JIS のパス名が String に無理矢理変換されて渡されます。しかし、Java 内部での文字コードは全て Unicode ですので当然文字化けします。これを回避するには、一旦文字コード変換なしで byte 配列に変換し、それを JISAutoDetect encoding で再び String にしてやる必要があります。

byte[] bytes = string.getBytes("8859_1");
string = new String(bytes, "JISAutoDetect");

という感じ。

Category クラスのカテゴリ名、AbstractRecord クラスのテキスト部分

こっちはもっと深刻で、どちらのクラスも元々 2byte の文字を 1byte ずつ読み込んで、2byte 文字に拡張して String 化するという処理をやってしまってます。

これは、Palm から公開されてるソースにパッチを当てるのが一番手っ取り早いです。

具体的には、文字列の読み込み部分(Category#parseCategories の name を読み込む部分、AbstractRecord#readCString)を以下のように一旦バッファリングするように変更します。

ByteArrayOutputStream bos = new ByteArrayOutputStream();

do \{
  c = in.read();
  if (c != 0)
    bos.write(c);
 \} while (c > 0);

 bos.flush();
 bos.close();

 return new String(bos.toByteArray(), "JISAutoDetect");

次の JSync では改善して欲しいですね。

commentプラグインは存在しません。

目次