連載
» 2009年03月04日 00時00分 公開

文字化けに関するトラブルに強くなる【実践編】Oracleトラブル対策の基礎知識(6)(3/4 ページ)

[渡部亮太,株式会社コーソル]

対処法

 ここで説明した「〜」の文字化けに対処するには、以下の2つの方法があります。

1.Oracleの変換ルールをJava VMの変換ルールに合わせる
具体的には、シフトJISの0x8160(「〜」)をU+301Cではなく、U+FF5Eに双方向変換するようにする(→Oracle側での対処:後述)

2.Javaのアプリケーション側に変換ロジックを組み込む
Javaのアプリケーションに、Oracleから受け取った文字データにU+301Cが含まれていた場合、U+FF5Eに変換するロジックを組み込む(→アプリケーション側での対処)

 なお、上記ではデータベースキャラクタセットがJA16SJISの場合について説明しましたが、JA16EUCでも同様の問題が発生します。

JA16SJISTILDE/JA16EUCTILDEによる対処

 上記の問題にOracle Database側で対処する方法として、Oracle Database R9.x以降の版では、JA16SJISとJA16EUCに替わる新しいキャラクタセットである「JA16SJISTILDE」と「JA16EUCTILDE」が用意されています。

 キャラクタセットJA16SJISTILDEは、JA16SJISの変換表において、シフトJISの0x8160(=「〜」)の変換ルールのみを変更したキャラクタセットです。JA16SJISでは0x8160(=「〜」)はU+301Cに変換されますが、JA16SJISTILDEではU+FF5Eに変換されます。

 このキャラクタセットJA16SJISTILDEをデータベースキャラクタセットに使用し、図5と同様の処理を行った場合の文字データ変換についてまとめたのが図6です。

図6 データベース側の文字コードをJA16SJISTILDEにした場合の変換の流れ 図6 データベース側の文字コードをJA16SJISTILDEにした場合の変換の流れ

 0x8160に関する文字コード変換がJava VMとOracleで基本的に同じになったことで、データ取得時にWebブラウザに対して0x8160が返されていることが分かるでしょう。

 先に説明したとおり、「〜」の文字化けには、Oracle側での対処とアプリケーション側での対処の2つの方法があります。

 しかし、アプリケーション側で対処を行う場合、Oracleのデータを参照するすべてのアプリケーションに対処策を実装しなくてはなりません。このため、Oracle側でJA16SJISTILDEを使用する対処がよりスマートなやり方です。

 Oracle Database 11gから、Windows版でのNLS_LANGのキャラクタセットやDBCAのデータベースキャラクタセットのデフォルト値がJA16SJISTILDEとなっていることから、今後は、シフトJIS系のキャラクタセットとしては基本的にJA16SJISTILDEを使用する方向となると思われます。もちろん、既存システム、データなど、過去の経緯があるため文字コードの問題については、さまざまな観点からの判断が必要ですが、新規システムにおいてシフトJISを採用する場合は、基本的にJA16SJISTILDEを使用することが望ましいと思われます。

複雑な文字化け:JIS X 0213とサロゲートペア

 ここからは、Vista以降のWindows OSで採用されたJIS X 0213に関連する文字化けと、JIS X 0213をUnicodeで扱ううえで特殊な処理が必要なサロゲートペアについて説明します。

Vistaが新たに対応したJIS X 0213とは?

 Windows VistaとWindows Server 2008はJIS X 0213と呼ばれる新しいJIS規格に対応しています。Windows Vistaより過去のバージョンのWindowsはJIS X 0208のみに対応しており、JIS X 0213に対応していませんでした。

 JIS X 0213は基本的に文字集合を規定する規格であり、文字コードそのものではありません。従って、JIS X 0213で追加された文字を使用するためには、JIS X 0213に対応した文字コードを使用する必要があります

 JIS X 0213に対応する文字コードで、現在最も一般的に使用されているのがUnicode(バージョン3.2以降)です。Windows VistaとWindows Server 2008でも、Unicodeを用いることでJIS X 0213に対応しています。

Oracle DatabaseでJIS X 0213に対応するには

 Oracleに、JIS X0213で追加された文字を格納するにはどのようにすればいいのでしょうか。

 日本語環境で一般的に使用されるデータベースキャラクタセットには、表1に示すものがありますが、このうち、JIS X 0213で追加された文字に対応しているデータベースキャラクタセットは、Oracle Database 10g R1以降のAL32UTF8だけです。

 AL32UTF8以外のキャラクタセットはJIS X 0208をベースとしたキャラクタセットであるため、JIS X 0213で追加された文字には対応していません。また、9iR2以前のAL32UTF8はUnicode 3.2に対応していないため、JIS X0213で追加された文字には対応していません。

データベースキャラクタセット 対応する文字コード
JA16SJIS シフトJIS
JA16EUC 日本語EUC
JA16SJISTILDE シフトJIS
JA16EUCTILDE※※ 日本語EUC
AL32UTF8 UTF-8
表1 日本語環境で使用される代表的なデータベースキャラクタセット

 ※:JA16SJISとチルダ文字のマッピングのみが異なる。

※※:JA16EUCとチルダ文字のマッピングのみが異なる。


 従って、Windows Vista以降のWindowsで入力可能なすべての文字をデータベースに格納するためには、Oracle Database 10g R1以降のデータベースを使用し、データベースキャラクタセットにAL32UTF8を選択する必要があります。

 なお、データベースキャラクタセットに対応していない文字を格納しようとした場合の動作については、前回説明していますので、必要に応じて確認してみてください。

新規のデータベースではAL32UTF8も検討したい

 Windows Vistaの登場により注目されたJIS X 0213ですが、今後、Vistaが普及し、さまざまなWindowsアプリケーションがJIS X 0213へ対応するにつれ、システム要件としてJIS X 0213対応が求められる可能性は高いでしょう。

 また、運用中のデータベースの構成や動作環境を変更する場合はさらに、アプリケーションやシステム全体への影響度を慎重に見極めながら実施する必要があるため、多くの工数が必要となります。

 このため、今後新規に構築するデータベースで、シフトJISが必須でない場合については、データベースキャラクタセットにAL32UTF8を使用することをお勧めします。

JIS X 0213とクライアント環境

 システム全体として、適切にJIS X 0213で追加された文字を格納・参照するためには、データベースキャラクタセットをAL32UTF8とするだけではなく、クライアント環境でも適切にJIS X 0213で追加された文字を処理する必要があります。

 JIS X 0213に対応する文字コードとして、一般的に使用されているのはUnicodeであるため、OS、アプリケーション、ライブラリの処理がすべてUnicodeに対応しており、フォントを含めたOSの表示環境(GUI)や、IMEを含めた入力環境がJIS X 0213で追加された文字に対応している必要があります。

 例えば、Windows Vistaより前にリリースされたWindows XPは、デフォルトの構成では表示環境、入力環境がJIS X 0213に対応していません。また、Oracleが提供する最も一般的なクライアントアプリケーションであるSQL*PlusのWindows版は、処理がUnicodeに対応していないため、JIS X 0213未対応となります。

 逆に、Windows Vista上で動作するJavaアプリケーション注2や、.NET Frameworkを用いた.NETアプリケーションは、内部処理をUnicodeで行っており、表示環境、入力環境がJIS X 0213(JIS X 0213に対応したUnicode3.2以降)に対応しているため、原則的にJIS X 0213に対応していることになります。

注2:Java 5以降。



Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。