shift-jis と utf-8 の混在問題に関する記事(リンクリスト)に戻る
情報システムの設定ファイルや汎用的データファイル、そして他システム連携などに広く使われているデータファイル形式に「XML」というフォーマットがある。
W3C(World Wide Web Consortium)というWeb技術の標準化を行う国際的な非営利団体が、ITシステムがデータを全てのWebシステムで同様のデータフォーマットで扱えるように、標準化したデータフォーマットの規格が XML(Extensible Markup Language)である。
W3CはWeb技術を使用する全ての規格の標準化に取り組んでおり、HTMLの規格もW3Cが定めている。
代表的なW3C規格は、HTML・XML・XHTML・CSS・DOM(Document Object Model)と言ったところだ。
多くのITシステムはこのW3C規格に従って開発されている。
Webの規格だが、業務系ITシステムでも設定ファイルや汎用的データファイル、他システム連携に使用するデータフォーマットの規格は世界標準規格のW3C規格を使用する。
特によく使われるのが XML と JSON というデータフォーマットである。
JSON は RFC で定められており、W3C規格ではない。
JSON については後日記事に書く。
XML の規格は無料でWEB公開されており、誰でも読むことができる。
規格の内容については公開されたXML仕様書を読めば良いので解説はしない。
だだ、この記事では XMLの文字エンコーディングについてだけ解説したいと思う。
XMLの文字エンコーディングの規格
XMLはデータフォーマットだけではなく、そのデータで使用する文字エンコーディングの種類と使い方についても規則が定められている。
W3C勧告においては次のように記載されている。
「文字コード点をビットパターンにエンコードする機構は、実体によって異なっていても良い。
すべてのXMLプロセッサは、Unicode [Unicode]のUTF-8エンコーディングとUTF-16エンコーディングを受け容れなければならない(must)。
二つのエンコーディングのどちらが使われているかを知らせる機構や、他のエンコーディングを使う為の機構については、4.3.3 実体で使われる文字エンコーディング Character Encoding in Entitiesで取り扱う。」
「4.3.3 実体で使われる文字エンコーディング Character Encoding in Entities
一つのXML文書で使われる外部解析対象実体は、それぞれ異なるエンコーディングを文字に対して用いても良い。
すべてのXMLプロセッサは、UTF-8エンコーディングやUTF-16エンコーディングで表された実体を、両方とも読み取れなければならない(must)。
この仕様書で使われる用語"UTF-8"と"UTF-16"は、異なる名前を持つ文字エンコーディングを指したりはしない。
たとえそのエンコーディング方法やその名前がどんなにUTF-8やUTF-16に似ていてもである。」
「UTF-16でエンコードされた実体は、ISO/IEC 10646 [ISO/IEC 10646]やUnicode [Unicode]で説明されているバイトオーダーマーク(Byte Order Mark、BOM。ZERO WIDTH NO-BREAK SPACE文字(#xFEFF)の事)から始まらなければならない(must)。
UTF-8でエンコードされた実体は、バイトオーダーマークから始まっても良い(may)。バイトオーダーマークはエンコーディングのシグネチャであり、そのXML文書のマークアップの一部でも文字データの一部でもない。
XMLプロセッサは、この文字を、UTF-8でエンコードされた文書とUTF-16でエンコードされた文書を区別する為に使えなければならない(must)。」
「XMLプロセッサに絶対に要求されるのはUTF-8エンコーディングやUTF-16エンコーディングで表された実体を読み取れる事だけではあるが、他にも沢山のエンコーディングが世界各地で使われている事が知られており、XMLプロセッサがそれらのエンコーディングで表された実体をも読み取れる事が望まれるかも知れない。外部の文字エンコーディング情報(MIMEヘッダなど)が無いのであれば、UTF-8とUTF-16以外のエンコーディングで記録された解析対象実体は、エンコーディング宣言を含むテキスト宣言(4.3.1 テキスト宣言 The Text Declaration参照)から始まらなければならない(must)。エンコーディング宣言は次の通りである。」
「 テキスト宣言」と「エンコーディング宣言」の引用は省略し、こちらで解説する。
引用した規格書(仕様書)を簡潔に解説する。(読めば分かる人も多いだろうが)
XMLは原則としてUTF-8かUTF-16で記載する
あくまで原則だが、文字エンコーディングを特に指定しないで、XMLを使用する場合はUTF-8かUTF-16の文字エンコーディングで記述するのが規則である。
文字エンコーディング指定しないのなら、UTF-8かUTF-16である事が必須となる。
そしてUTF-8とUTF-16のXMLデータは両方読み取れなければならない。
また、UTF-16を使用する場合は先頭にBOMを付ける事が必須である。
UTF-8を使用する場合は、BOMを付けても付けなくても良い。
規格書にはUTF-16のBOMとして「#xFEFF」を付ける事を義務づけているが、これはUTF-16BEのBOMである。
ここだけ見ると「UTF-16BEを使わなければならないのか」と思うかも知れないが、最初に「文字コード点をビットパターンにエンコードする機構は、実体によって異なっていても良い。」と書かれているので、LEかBEかは特に定められてはいないと考える。
UTF-16LEもUTF-16BEも、CPUレジスタに読み込まれると同じ値になる。
UTF-16LEではメモリやファイルでのバイトの並び順が逆向きになるだけで、文字コード番号自体は同じである。
UTF-16LEのBOM「#xFFFE」も、CPUレジスタに読み込まれると、UTF-16BEと同じ「#xFEFF」になる。
よってUTF-16LEとUTF-16BEはどちらを使用しても良いし、両者はBOMで区別できる。
UTF-8 を使用する場合は、BOM有りでも無しでも、両方明確に許可されている。
他のエンコーディングはエンコーディング宣言が必須
UTF-8とUTF-16以外の文字エンコーディングを使用する場合は、XMLの最初の行にエンコーディング宣言を記述する事が義務づけられる。
エンコーディング宣言はテキスト宣言の中に記述する。
テキスト宣言とは<?xml>ダグの事で、ダグの中にXMLバージョンと文字エンコーディングを指定する。
例えば、xml v1.0 で、Shift-JIS を使用する場合のテキスト宣言は以下のようになる。
<?xml version="1.0" encoding="Shift_JIS"?>
テキスト宣言は必ず英数字で書かなければならない。
プログラム的には先頭の<?xml>ダグだけASCIIコードで読み込み、encodingの値を取得して、文字エンコーディングを再指定してから、その後のXMLデータを読み込む事になる。
そしてUTF-8とUTF-16のXMLデータは両方読み取れなければならない。
エンコーディング宣言を加えれば Shift-JIS を使用する事は許可されるが、UTF-8とUTF-16を読み取れなくても良いわけではない。
また、UTF-8 はBOM無しでの使用が認められるが、その場合はエンコーディング宣言しなければ使用している文字エンコーディングが識別できないので、エンコーディング宣言は必須となる。
<?xml encoding='UTF-8'?>
データ交換の世界ではUNICODEは必須である
現在の Windows 環境で主に運用されている業務ITシステムでは、まだまだ Shift-JIS を使用するケースが多いと思う。
現実の業務システムの現場では、コストとレガシーシステムやレガシーデータの活用の観点から、Shift-JIS でXMLなどのデータを扱っているのが現場の実状だろう。
しかし、これまで説明したように Web などの国際標準規格の中では既にUNICODEのエンコーディングである UTF-8とUTF-16 は読み取れる事が必須となっている。
これからは、海外の拠点とデータ連携する事も多くなるだろう。
そうなると外国語に対応できない Shift-JIS では海外拠点とシステム連携できない。
以前からこの問題を記事に書いているが、そろそろどこかのタイミングでUTF-8やUTF-16にシステム対応する事を検討しておいた方が良いと思う。
その為のノウハウはこれまで記事に書いてきたはずである。
ITエンジニアではない、業務担当者や経営者の皆さんにも、この課題は認識しておいて欲しい。
UTF-8やUTF-16にシステム対応するには、それなりのコストとスケジュールが必要だ。
システム担当者と相談ぐらいはしておいて欲しい。
shift-jis と utf-8 の混在問題に関する記事(リンクリスト)に戻る