103.9. 文字セットの使用

Camel 2.9.3 以降で利用可能
charset オプションを使用すると、コンシューマーエンドポイントとプロデューサーエンドポイントの両方でファイルのエンコードを設定できます。たとえば、utf-8 ファイルを読み込んで、ファイルを iso-8859-1 に変換する場合は、次のようにします。

from("file:inbox?charset=utf-8")
  .to("file:outbox?charset=iso-8859-1")

ルートで convertBodyTo を使用することもできます。以下の例では、まだ utf-8 形式の入力ファイルがありますが、ファイルの内容を iso-8859-1 形式のバイト配列に変換します。そして、Bean にデータを処理させます。現在の文字セットを使用して送信トレイフォルダーにコンテンツを書き込む前。

from("file:inbox?charset=utf-8")
  .convertBodyTo(byte[].class, "iso-8859-1")
  .to("bean:myBean")
  .to("file:outbox");

コンシューマーエンドポイントで文字セットを省略した場合、Camel はファイルの文字セットを認識せず、デフォルトで UTF-8 を使用します。ただし、キー org.apache.camel.default.charset を使用して、JVM システムプロパティーをオーバーライドし、別のデフォルトエンコーディングを使用するように設定できます。

以下の例では、ファイルが UTF-8 エンコーディングでない場合、これが問題になる可能性があります。これは、ファイルを読み取るためのデフォルトのエンコーディングです。
この例では、ファイルを書き込むときに、コンテンツはすでにバイト配列に変換されているため、コンテンツをそのまま (さらにエンコーディングせずに) 直接書き込みます。

from("file:inbox")
  .convertBodyTo(byte[].class, "iso-8859-1")
  .to("bean:myBean")
  .to("file:outbox");

キー Exchange.CHARSET_NAME を使用してエクスチェンジのプロパティーを設定することにより、ファイルの書き込み時に動的なエンコーディングをオーバーライドして制御することもできます。たとえば、以下のルートでは、メッセージヘッダーの値を使用してプロパティーを設定します。

from("file:inbox")
  .convertBodyTo(byte[].class, "iso-8859-1")
  .to("bean:myBean")
  .setProperty(Exchange.CHARSET_NAME, header("someCharsetHeader"))
  .to("file:outbox");

より単純にすることをお勧めします。同じエンコーディングのファイルをピックアップし、特定のエンコーディングでファイルを書き込みたい場合は、エンドポイントで charset オプションを使用することをお勧めします。

エンドポイントで charset オプションを明示的に設定した場合は、Exchange.CHARSET_NAME プロパティーに関係なく、その設定が使用されることに注意してください。

いくつかの問題がある場合は、org.apache.camel.component.file で DEBUG ロギングを有効にし、特定の文字セットを使用してファイルを読み書きするときに Camel ログを有効にすることができます。
たとえば、以下のルートでは次のログが記録されます。

from("file:inbox?charset=utf-8")
  .to("file:outbox?charset=iso-8859-1")

そしてログ:

DEBUG GenericFileConverter           - Read file /Users/davsclaus/workspace/camel/camel-core/target/charset/input/input.txt with charset utf-8
DEBUG FileOperations                 - Using Reader to write file: target/charset/output.txt with charset: iso-8859-1