2012年5月7日月曜日

文字化けと文字コードについて

1. 文字化けについて

biz-Streamでドキュメントを生成すると、プログラムの構造や動作環境により、特定の文字が正しく出力されず、文字化けが発生することがあります。

biz-StreamはJavaのクラスライブラリであり、Java内部では文字はUnicodeで処理されます。Unicode以外の文字コードを使用している場合には、Javaの内部処理の過程で一度Unicodeへの変換が自動的に発生します。このため、多くの場合以下のような入力時と出力時の文字コードが異なっている場合に文字化けが発生します。

【 原因1 】 設定した文字コードに含まれていない文字を使用している
出力用に指定された文字コードに含まれない文字を利用している場合、正常に表示されません。
例えば、「Shift_JIS」に「�」の文字が無いため、他のコードから変換を行った場合には正しく文字が表示できません。
【 原因2 】 設定した文字コードからUnicodeへのマッピングが異なる
入力/出力用に指定された文字コードとUnicodeの変換時に正しい文字コードが割り宛てられていないため、ある文字コードで出力しようとする際文字化けが発生します。
例えば、「〜」は「Shift_JIS」からUnicodeへ変換した場合と「Windows-31J」からUnicodeに変換した場合のUnicodeの文字コードが異なります。
【 原因3 】 変換文字コードの誤り
Javaでファイルを読み込む場合は、自動的に稼働環境の文字コードからUnicodeへの変換が行なわれます。このため、入力ファイルと環境の入力ファイルの文字コードが異なる場合には誤ったコード変換が行われ、文字化けが発生します。

上記のように、文字化けは文字コードの変換処理に伴って発生します。従って文字化けを解消するためには、入力から出力までの一連の処理で、統一された文字コードを適用することが最も近道となります。

2. biz-Streamにおける文字コード設定について

biz-Streamでは、下記の箇所で文字コードを設定することができます。

それぞれの設定のエンコーディングが異なる場合は、文字化けが起こる可能性があります。このため、文字コードの詳細について把握していない場合は、すべてのエンコーディング設定を同じにすることをお勧めいたします。

《 設定1 》 レイアウトXMLファイル

レイアウトのXMLファイル自体にエンコーディングが設定可能です。文字化けが発生した場合、表示されている文字がレイアウトファイルのエンコーディングに含まれているか確認し、正しく表示できるエンコーディングを指定してください。【 原因1 】

設定箇所 説明
レイアウトXMLファイル 設定値としては、IANA(※[参照2])に登録されている文字集合が設定可能です。
biz-Streamでは、レイアウト・デザイナの「ツール」→「オプション」→「入出力」→「文字コード」により設定します。(UTF-8, Windows-31J, Shift_JIS, EUC-JPが選択できます)

直接XMLファイルを編集する場合には、レイアウトXMLファイルの先頭行 <?xml version="1.0" encoding="「エンコーディング」"?> の「エンコーディング」部分を修正します。
その場合にはXMLファイル自体のエンコードも「エンコーディング」に合わせてください。

《 設定2 》 プロパティファイル

biz-Streamではプロパティファイルの設定により、内部処理のエンコーディングが指定可能です。
プロパティファイルは、<biz-Streamインストールディレクトリ>/pdf.properties および pdf_ja_JP.propertiesです。

設定箇所 説明
rksj.encoding 本属性は、PDF内部フォントの文字コード変換に使用されます。
通常、PDFにおいて日本語フォントを利用する場合には、RKSJ系(=Shift_JIS)のフォントを使用し、それによって文字コード変換も決まります。従って、本来は文字コードのみを変更するのではなく、フォントを変更することによって、対応した文字コード変換が選ばれるというものになります。
フォントを変更せずに文字コードのみを変更する場合にはシフトJIS系の文字コードを指定することが必要です。
pdf.encoding 本属性は、フォントを指定するコンテンツとしての「テキスト」以外のPDFに書き込まれる文字列(e.g. タイトル、作成者)などに対する文字コード変換を指定するものです。
これは、PDFファイルのプロパティにて参照可能な情報です。このため、PDFの本文中の文字化けに関しては、上記のrksj.encodingの設定を変更してください。
server.encoding COMクライアントからCOMサーバに送られるデータの文字コード変換を指定します。
COMサーバをご利用の際の文字化け処理に設定します。COMサーバを利用されていないお客様には関係ありません。
《 設定3 》 Java実行環境のプロパティ

biz-Streamの帳票生成部分はJavaのライブラリです。このため、Java実行環境のプロパティによるエンコーディング設定も文字化けの原因となります。

設定箇所 説明
file.encoding Java実行時のデフォルト文字コード変換を設定します。
省略時は、実行時のOSの環境に対応したものが設定されます。
この設定はデータソースとして指定したCSVファイルなどをbiz-Streamで読み込む際の文字コードとして使用されます。
この設定はJavaの実行引数オプションで 「-Dfile.encoding=Shift_JIS」を付加して実行、Javaアプリケーション内で「System.setProperty("file.encoding","「エンコーディング」"); 」のメソッド呼び出しにより設定可能です。 その他アプリケーションサーバで実行の際にはアプリケーションサーバにて設定可能です。

但し、このfile.encodingの設定はJavaのバージョンにより有効/無効な場合があります。

Javaバージョン 有効
Java 1,2,2_017 ×
Java 1.3.0_05 ×
Java 1.4.1_07
Java 1.4.2_10 ×
Java 1.5 以降

3. 設定と文字化けの例

発現頻度が高い文字化けの例を下記に記します。

《 例1: レイアウト・デザイナでレイアウトXMLファイル保存時に「�」や「〜」などが文字化け 》
● 設定
  • レイアウトXMLファイルのエンコーディング: Shift_JIS
  • pdf.propertiesファイルの rksj.encoding: MS932
● 発生原因
「�」は「Shift_JIS」に含まれない文字のため正しく変換できません。 【 原因1 】
「〜」はUnicodeへの変換時に正しく変換できません。 【 原因2 】
● 解決法
レイアウトXMLファイルのエンコーディングを 「Windws-31J」に設定することで、レイアウトXMLファイルとフォントの文字コード変換設定が統一され、正しく文字を表示することができます。(「Windows-31J」と「MS932」は実質的に同一です。) 《 設定1 》
逆に rksj.encodingを「Shift_JIS」に設定し、レイアウトXMLファイルとフォントの文字コード変換設定を統一しても、レイアウトXMLファイルの保存時の問題であるため、文字化けは解決しません。
また、レイアウトXMLファイルのエンコーディングを「UTF-8」に設定した場合、文字コードの変換が発生しないため、文字化けは発生せず正しく文字を表示することができます。
《 例2: CSVファイル中の「〜」や「�」などが文字化け 》
● 設定
  • レイアウトXMLファイルのエンコーディング: Windows-31J
  • pdf.propertiesファイルの rksj.encoding: MS932
  • データソースCSVファイルのエンコーディング: Windows-31J/MS932
  • Java実行環境プロパティの file.encoding: Shift_JIS
● 発生原因
データソースであるCSVファイルは「〜」や「�」に対応した「Windows-31J」ですが、この例では file.encoding で指定された「Shift_JIS」が入力元文字コードとして適用されます。
「�」はShift_JISに含まれない文字のため正しく変換できません。 【 原因1 】
「〜」はUnicodeへの変換時に正しく変換できません。 【 原因2 】
● 解決法
Java実行環境(システムプロパティ)の file.encoding を「MS932」に設定し、文字コード変換設定を統一することで正しく文字を表示することができます。 《 設定3 》
(※但し、Javaのバージョンにより有効でない場合があります。)
《 例3: CSVファイル内の漢字・全角文字などが全て文字化け 》
● 設定
  • 実行プラットフォーム: LinuxまたはUNIX / 文字コードEUC(環境変数 LANG=ja_JP.eucJP)
  • レイアウトXMLファイルのエンコーディング: Windows-31J
  • pdf.propertiesファイルの rksj.encoding: MS932
  • データソースCSVファイルのエンコーディング: Windows-31J
● 発生原因
この場合は、CSVファイルをEUCファイルとして文字コード変換を行っているため、正しく文字が変換できません。 【 原因3 】
● 解決法
Java実行環境(システムプロパティ)の file.encoding を「MS932」にすることで正しく文字を表示することができます。 《 設定3 》
(※但し、Javaのバージョンにより有効でない場合があります。)
CSVファイルの文字コードをEUCコードに変換することで、「EUC-JP」からUnicodeへ文字変換が行われますが、「�」等の「EUC-JP」に無い文字がCSVファイル内にあった場合には正しく文字が表示することができません。
CSVファイルを「UTF-8」に変換し、file.encodingを「UTF-8」又は稼働環境をUTF-8(LANG=UTF-8)にすることにより正しい文字を表示することが可能です。

4. 参考情報

[ 参照1 ]
Unicode mapping: マッピングについての情報が提供されています。
(JDK1.4ではUnicode 3.0,JDK5.0ではUnicode 4.0の仕様を採用しています)
[ 参照2 ]
IANA CHARACTER SETS: 文字コードに含まれる文字に関する情報が提供されています。

0 件のコメント:

コメントを投稿