システム開発コラム集
システム開発に関するコラム集です。
15.文字化けについて
■文字化けの現象
サイトを閲覧した時、見た事のない変な文字が一部の区画に、もしくは全てに表示された経験はありませんか?
全体的に文字化けし何も読む事が出来ない場合は、プログラムやデータベースでの文字コードの宣言がされていない、もしくは、環境ごとに文字コードが異なっており各環境に合わせて処理が正しく行われていない事が原因と思われます。
メールをもらった時、文章の合間に変な文字が挿入されているのを見た事ありませんか?
一部の文字が文字化けを起こしている場合は、コンピュータの機種により存在しない文字、登録されている文字が異なっており、その文字が使用されている場合に発生します。
■各環境の文字コードの統一
単一の開発環境でシステム開発をしている人は、よく犯してしまいがちなのですが、自分の環境で正常に動作すれば、他でも正常に動作すると考えてしまいがちです。それも、自分の開発している環境の文字コードが何かを理解している人も少ないです。
システムでは、画面表示、データの保管(データベース)、印刷、ファイル出力、等があります。それらを統一の文字コードにする事が文字化けを避けるための最短の方法です。
プログラム(画面表示)は、Shift-JIS、データベースは、EUC-JPとした場合、EUC-JPのデータベースの中に、Shift-JISの文字を保存できますが、データベース単体で動作するような時に文字による処理が発生した場合、正常に動作しない可能性があります。例えばソート順は、Shift-JISでのソート順番ではなく、EUC-JPでのソート順となります。また、文字検索でも、Shift-JISで検索する事は出来ますが、EUC-JPでの検索は出来ません。
もし、この様な環境にどうしてもしなければならない場合は、プログラムとデータベース間でのやり取りを行う処理の時は、データベースからプログラム側にデータを持ってくる時は、EUC-JP→Shift-JIS変換をします。また、プログラム側からデータベースにデータを保存する時は、Shift-JIS→EUC-JP変換を行います。検索の時がややこしいのですが、クエリを作成し、検索文字だけEUC-JPに変換しクエリへはめ込むようになります。
■表示できない文字の存在
上記に加えて、もうひとつ、注意を払う必要があります。各文字コードには、割り当てられていない文字が存在します。もしくは、コンピュータの機種によって異なる文字が割り当てられていたりします。
例えば、Shift-JISでは、半角カタカナが存在しますが、JISでは、半角カタカナは存在しません。同じように、Windowsでは表示できる文字がMacには存在しなかったりします。
では、どんなものがあるのか、見てみましょう。
■半角カタカナ
もともと半角カタカナは、日本で使用するコンピュータにしか存在しませんでした。
まだ、オペレーティングシステムと呼ばれる存在が無かった頃に規格で自由に文字を割り当てしてよい領域を使用し半角カタカナ文字を使えるように登録したのがスタートです。
しかし、電子メールで使用されている文字コードのJIS(ISO-2022-JP)には、半角カタカナのコードが存在しないので電子メールに半角カタカナ自体を含む事が出来ません。そのためメールソフト等により、半角カタカナのまま送信したり、また、処理を追加したりした結果、受信先で文字化けを起こします。
これは、海外では、半角カタカナを含むコード領域をメールで送信しないために、メール送信を行う仕組みのSMTPにASCIIコードの8ビット目を0としてしまう様に処理させているため、8ビット目を使用している半角カタカナは文字化けを起こしてしまうのです。
現在では、Unicode化、Base64、ESMTP、MIME、半角→全角変換、等の様々な技術により半角カタカナを送信できるようになってきています。
また、サイトでの表示では、EUC-JPとShift-JISで半角カタカナの文字コードがかぶっているためコンピュータ側がどちらの文字コードを使用しているか誤判断し文字化けが発生します。
■機種依存文字
オペレーティングシステムが存在しない時代に、各コンピュータメーカーが、日本の文字コードに存在しない文字を独自に登録した事が起源となっています。コンピュータの特定の機種にしか存在していない、つまり、機種に依存している文字の事を言います。
つまり、別の機種に持って行くと同じコードであっても異なる文字が登録されているため別の文字が表示されてしまう現象が発生します。つまり、文字化けです。
NEC特殊文字、IBM拡張文字が特に有名です。
現在では、携帯電話からコンピュータにメールを送信すると絵文字がコンピュータでは表示できない事から、その部分が文字化けする事が確認できます。
代表的な機種依存文字