Pages

2014年10月16日木曜日

帳票運用ノウハウ!~帳票でよく困る、基本だけど意外と難解な文字コードの話~

「帳票データ中のなぜか1文字だけが変わってしまった?!」
と言う現象で、半日近く調べたりなどして混乱することがありました。結局は文字コードの問題でしたが、色々調べながら、昔も文字コードについて色々調べたはずなのに忘れてしまったなと思ったり、文字コードなんてエンジニアの基本と言えるのに、まるで迷宮のように難しく思えてしまったりしました。と言うわけで、またいつ忘れるかもわかりませんし、今更感もありますが、今回は文字コードについて書きたいと思います。

まず順を追って、上記の「なぜか1文字だけが変わってしまう」という現象を少し詳しく書きます。今回の現象は、シフトJISの入力データから帳票ファイルを作り、そのまま印刷を行うと言う処理の中で起きました。入力データをテキストエディタで開くと「栁」(柳の異体字)の文字なのに、印刷されたものを見ると「鉼」となります。それも変わっているのは「鉼」だけで他の文字は問題ありません。

これは、いわゆる文字化けでしょうか?よく出会う文字化けは全然読めたものではありませんが、今回の場合は、ほんの1文字だけが変わっています。

文字化けであれば、疑うのは文字コードの設定です。実は上記の処理、大雑把に説明すれば内部的には2つのプログラムで構成されています。プログラムAが出力したデータを、プログラムBが読み込んで、そして印刷をすると言う流れです。そうなると、やはりどうにも文字コードが怪しく思えてきます。「これはどこか文字コードの設定間違ってるな」
と。そして「設定直せばすぐに解決だな」と。ところが、設定を確認すると両方とも「シフトJIS」。このとき瞬間固まってしまいましたが、それでもじわじわと思い出しました。
「シフトJISって少し面倒だった気が….

前置きここまで、ここからは改めて調べてみたことなどを整理して書いてみます。

■シフトJISの正式名称
何をもって正式かと言うのも難しいですが、今回はIANAに登録されているものとします。
正式名称は「Shift_JIS」です。「Shift-JIS」(ShiftJISの間がハイフン)は正確には間違っています。他に「SJIS」もよく見ます。

■シフトJISにはいくつか種類がある
実はシフトJISにはいくつかの種類があります。
まずは、歴史的な背景と言うか、簡単に言えばJIS規格が定めるコンピューターが扱う文字種類が年々増えて、それと同時にShift_JISもバージョンアップして新しくなり種類が増えると言うものです。例えば、「JIS X 0213:2000」と言う扱える文字種類の範囲を定めた規格では、その前の「JIS X 0208:1997」に対して4000文字以上追加されています。さらに「JIS X 0213:2000」→「JIS X 0213:2004」となった時には、扱える文字の種類が多少増えて、さらに幾つか字体も変更されました。例えば「しんにょう」の点が1つから2つへ増えたなどの字体の変更がありました。

そして、JIS X 0213:2004へのバージョンアップしたのに伴い、Shift_JIS-2004と言う文字コードも新たに定義されました。次にあるのは、ベンダーに依存したシストJISです。やはり有名なのはWindowsでしょう。ベンダー依存のものでも、扱える文字種類の範囲に差がある場合があります。ここまで書けば、「なぜか1文字だけが変わってしまう」原因がこの辺にありそうだなと思っていただけると思います。

■文字集合と符号化方式
文字コードの考え方には、文字集合と符号化方式の2つの考え方が含まれています。
文字集合とは、すでに「コンピューターが扱う文字の種類の範囲」のことで、ここまで書いてきたことです。

符号化方式とは、実際にコンピューターがファイルを読み書きするときに、具体的にどのようなバイト表現なのか(どのようなバイト配列で表すのか)というものです。
文字集合が同じでも符号化方式が違えば異なる文字コードと言うのが一般的だと思っています(文脈によっては色々解釈があるようですが)。文字集合(文字の種類の範囲)が同じであっても、符号化方式(バイト表現)が違えば、文字コートが異なり、文字化けを起こすことになります。

■アプリがどのシフトJISに対応しているかわかりにくい
さて、先に書いた「WindowsにおけるシストJIS」(本当にこう呼んでよいものか不安)ですが、呼び名が色々あります。Wikipwdiaだと「Microsoft コードページ 932」、IANAだと「Windows-31J」、Java言語だと「MS932」という名前になっていますが、いずれも同じものを指しています(のはず)。

色々あって困ります。そこで、Windowsの「メモ帳」ではどう書いてあるか見てみました。
メニューの「名前を付けて保存」を選択すると保存ダイアログが表示され、保存する際の文字コードが選択できます。が、そしてそこにあるのは「ANSI」と言う名前です。
有名なテキストエディタ(秀丸やサクラエディタ、TeraPad)では「SJIS」と出ます。
ますます困ります。
アプリでの表記がSJISShift-JISとなっていたも、扱える文字種類の本当の範囲は知ることが難しいのです。アプリや実装などによって文字コードの名前は変わってしまうということで、自分が指定したものが本当は何なのかさえわからない場合もあるということです。

■再び、「栁」が「鉼」に入れ替わる件
さて、改めて「なぜか1文字だけが変わってしまう」の話に戻します。現象が発生した処理は2つのプログラムで構成され、プログラムAが出力したデータをプログラムBが読み込むと書きました。そして、どちらの文字コードの設定も「シフトJIS」でした。
ここまで来ると、この「シフトJIS」が、正確にはどのシフトJISなのかを正確に知る必要があることがわかります。

結果、それは、MS932_0213Shift_JIS-2004でした。そして、MS932_0213の「栁」とShift_JIS-2004の「鉼」は、同じバイト表現(FAE5)であったため、プログラムAが出力したデータをプログラムBを読み込む際に文字が入れ替わったものでした。しかしながら、普段、シフトJISの正確な種類を把握する必要性はそこまではないと思います。

普段使う文字では同じバイト表現であることがほとんどだからです。ただ、帳票となると多くの種類の人名や地名などが使われ、その中では普段は使われない文字が含まれるケースが増えます。そして普段使われないような文字ではバイト表現が異なることが多いという傾向があるため、帳票システムでは特にシフトJISの正確な種類を把握する必要がでてくるということになります。

帳票システムは、様々なところからのデータを受け取ります。
時にはWindowsの業務アプリから、同じくUNIXから、そしてメインフレームから。
そんなデータでは、様々な文字コードが使われています。
そして残念ながら、ひとつひとつ正確な文字コードを把握して対応していくほかないのではないでしょうか。

0 件のコメント:

コメントを投稿