文字化けと文字コードについて
2006年07月06日
biz-Streamをご使用中のユーザー様からお問い合わせいただくことの多い、文字化けと文字コードに関してご説明いたします。
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ファイル
設定箇所: レイアウトXMLファイルの先頭行 <?xml version="1.0" encoding="<エンコーディング>"?> のエンコーディング部分
説明: 設定値としては、IANA(※[参照2])に登録されている文字集合が設定可能です。
biz-Streamでは、レイアウト・デザイナの「ツール」→「オプション」→「入出力」→「文字コード」により設定します。(V4.2.0では、UTF-8, Windows-31J, Shift_JIS, EUC-JPが選択できます)
【設定2】 プロパティファイル
<biz-Streamインストールディレクトリ>/pdf.properties および pdf_ja_JP.properties
設定箇所: pdf.encoding
説明: 本属性は、フォントを指定するコンテンツとしての「テキスト」以外のPDFに書き込まれる文字列(e.g. タイトル、作成者)などに対する文字コード変換を指定するものです。
設定箇所: rksj.encoding
説明: 本属性は、フォントの文字コード変換に使用されます。通常、PDFにおいて日本語フォントを利用する場合には、RKSJ系(=Shift_JIS)のフォントを使用し、それによって文字コード変換も決まります。従って、本来は文字コードのみを変更するのではなく、フォントを変更することによって、対応した文字コード変換が選ばれるというものになります。フォントを変更せずに文字コードのみを変更する場合にはシフトJIS系の文字コードを指定することが必要です。
設定箇所: server.encoding
説明: COMクライアントからCOMサーバに送られるデータの文字コード変換を指定します。
【設定3】 Java実行環境のプロパティ
Java実行環境プロパティ
設定箇所: file.encoding
説明: Java実行時のデフォルト文字コード変換を設定します。省略時は、実行時のOSの環境に対応したものが設定されます。この設定はデータソースとして指定したCSVファイルなどをbiz-Streamで読み込む際の文字コードとして使用されます。
この設定はJavaの実行引数オプションで 「-Dfile.encoding=Shift_JIS」を付加して実行、Javaアプリケーション内で「System.setProperty("file.encoding","<エンコーディング>"); 」のメソッド呼び出しにより設定可能です。
その他アプリケーションサーバで実行の際にはアプリケーションサーバにて設定可能です。
但し、このfile.encodingの設定はJavaのバージョンにより有効/無効な場合があります。
| Java 1,2,2_017 | × |
| Java 1.3.0_05 | × |
| Java 1.4.1_07 | ○ |
| Java 1.4.2_10 | × |
| Java 1.5.0_06 | ○ |
3. 設定と文字化けの例
発現頻度が高い文字化けの例を下記に記します。
【例1】
レイアウトXMLファイルのエンコーディング: Shift_JIS
pdf.propertiesファイルの rksj.encoding: MS932
レイアウト・デザイナでレイアウトXMLファイル保存時に「①」や「~」などが文字化けします。
「①」は「Shift_JIS」に含まれない文字のため正しく変換できません。【原因1】
「~」はUnicodeへの変換時に正しく変換できません。【原因2】
解決法
レイアウトXMLファイルのエンコーディングを 「Windws-31J」に設定することで、レイアウトXMLファイルとフォントの文字コード変換設定が統一され、正しく文字を表示することができます。(「Windows-31J」と「MS932」は実質的に同一です。)【設定1】
逆に rksj.encodingを「Shift_JIS」に設定し、レイアウトXMLファイルとフォントの文字コード変換設定を統一しても、レイアウトXMLファイルの保存時の問題であるため、文字化けは解決しません。
また、レイアウトXMLファイルのエンコーディングを「UTF-8」に設定した場合、文字コードの変換が発生しないため、文字化けは発生せず正しく文字を表示することができます。
【例2】
レイアウトXMLファイルのエンコーディング: Windows-31J
pdf.propertiesファイルの rksj.encoding: MS932
データソースCSVファイルのエンコーディング: Windows-31J/MS932
Java実行環境プロパティの file.encoding: Shift_JIS
CSVファイル中の「~」や「①」などが文字化けします。
データソースであるCSVファイルは「~」や「①」に対応した「Windows-31J」ですが、この例では file.encoding で指定された「Shift_JIS」が入力元文字コードとして適用されます。
「①」はShift_JISに含まれない文字のため正しく変換できません。【原因1】。
「~」はUnicodeへの変換時に正しく変換できません。【原因2】
解決法
Java実行環境(システムプロパティ)の file.encoding を「MS932」に設定し、文字コード変換設定を統一することで正しく文字を表示することができます。【設定3】
(※但し、Javaのバージョンにより有効でない場合があります。)
【例3】
実行プラットフォーム: Linux OS / 文字コードEUC(環境変数 LANG=ja_JP.eucJP)
レイアウトXMLファイルのエンコーディング: Windows-31J
pdf.propertiesファイルの rksj.encoding: MS932
データソースCSVファイルのエンコーディング: Windows-31J
CSVファイル内の漢字・全角文字などが全て文字化けします。(半角文字のみ正常表示)
この場合は、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)にすることにより正しい文字を表示することが可能です。
参考情報
[参照1]
Unicode mapping: マッピングについての情報が提供されています。
http://www.unicode.org/Public/MAPPINGS/
(JDK1.4ではUnicode 3.0,JDK5.0ではUnicode 4.0の仕様を採用しています)
[参照2]
IANA CHARACTER SETS: 文字コードに含まれる文字に関する情報が提供されています。
http://www.iana.org/assignments/character-sets











