20.11. 文字セットの使用
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