第28回 文字符号化の問題に決着を付ける Page 1

XML 1.0は、1998年にW3Cから勧告として公開された。当然中身は英語で、しかもEBNFと呼ばれる式によって重要な部分が記述してある。この連載では、XML 1.0を深く理解するために、そのXML 1.0勧告の最新版「Extensible Markup Language (XML) 1.0 (Third Edition)」をだれでも分かるように、やさしく読み解きながら解説していくことを目指している。(編集局)

川俣 晶
株式会社ピーデー
2004/12/17

実体における文字符号化の問題解決を探る

主な内容
--Page 1--
実体における文字符号化の問題解決を探る
サポートすべき符号化の規定
--Page 2--
符号化宣言のEBNFによる生成規則
符号化宣言に記述する文字符号化スキーム名
--Page 3--
エラーとなる符号化のケース
符号化宣言を含むテキスト宣言の例

 前回「実体における文字符号化の問題を整理する」は、文書実体や外部解析対象実体の文字符号化について扱う「4.3.3 Character Encoding in Entities(4.3.3 実体における文字符号化)」を途中まで読んだ。ここでは、実体をUTF-8で記述したのか、シフトJISで記述したのか、といった相違を正しく判定する方法について記述している。XMLでは比較的まっとうに文字符号化の問題に対処できているものの、そもそも文字の符号化は複雑で悩ましい問題故に、それなりのボリュームを含む。前回は、その中でも、実体における文字符号化、外部解析対象実体の文字符号化、Byte Order Markをめぐる根深い問題といった問題について読んだ。

 今回は、その続きに取り組もう。そして、「4.3.3 Character Encoding in Entities(4.3.3 実体における文字符号化)」を最後まで読み切りたいと思う。ここには、文字の符号化、符号化宣言、テキスト宣言の出現位置などについて書かれている。符号化宣言は、XML宣言の中に記述される「encodeing="……"」という部分に当たる。XMLに入門する初心者が誰でも一度は書いてみる構文なので、多くの読者が親しみを持てるのではないかと思う。しかし、入門書では触れないような深いレベルまで追求していくことになるので、しっかりと読んでいこう。

編集注:この連載では、XML 1.0勧告であるW3Cの「Extensible Markup Language (XML) 1.0 (Third Edition)」(英語)を参照し、その日本語訳として、日本工業規格 JIS X 4159:2002(Second Edition相当。リンク先は該当規格の原案ですが、最終版とほぼ同等の内容です)と追補1として出版予定の原稿(Third Edition対応)を参照しています。本文中のピンクの地の部分は、XML 1.0勧告の原文を示しています。

サポートすべき符号化の規定

 次の文章は、どの符号化をサポートすべきかについての規定である。

Although an XML processor is required to read only entities in the UTF-8 and UTF-16 encodings, it is recognized that other encodings are used around the world, and it may be desired for XML processors to read entities that use them. In the absence of external character encoding information (such as MIME headers), parsed entities which are stored in an encoding other than UTF-8 or UTF-16 MUST begin with a text declaration (see 4.3.1 The Text Declaration) containing an encoding declaration:

XMLプロセサは、UTF-8およびUTF-16で符号化した実体を読めなければならないが、ほかの符号化が世界では用いられることも多く、それらの符号化を用いる実体をXMLプロセサは処理できることが望ましい。外部の文字符号化情報(MIMEヘッダなど)がない場合、UTF-8またはUTF-16以外の符号化を用いて格納する解析対象実体は、符号化宣言を含むテキスト宣言(4.3.1 テキスト宣言を参照のこと。)で始めなければならない。

 冒頭に書かれているUTF-8とUTF-16が必須であるという規定は、「2.2 Characters(2.2 文字)」にすでにあるので、ここでそれを規定しているわけではない。ここで重要なのはその後である。この世界には、この2つ以外の符号化も多数使われているので、それらをサポートすることが望ましい、ということである。それが必須(MUST)ではなく、望ましい(SHOULD)のレベルになっていることは、すべての符号化をサポートすることは著しくハードルが高いためだろう。

 例えば、日本では多くのコンピュータメーカーが独自のコード体系を持ち、さらに顧客の要求に応じて、顧客ごとに独自にコード割り当てを行っているケースがある。これらのすべてに対応することは不可能といえるだろう。しかし、利用者の多い、主要な符号化に対応することは利便性を高め、大いに価値がある。例えば、日本であればシフトJISやEUC-JPを利用可能にすると、古い世代のシステムでもXML文書を作成することが容易になり、効果は大きい。

 次の文章の主語は、解析対象実体である。文書実体を含まないことに注意が必要である。さて、この文章は2つの条件を提示して、それを満たす解析対象実体は、テキスト宣言を先頭に記述しなければならないといっている。なお、テキスト宣言は、符号化宣言を省略できないので、それを含むのは当然のことである。

 では、2つの条件とは何か。1つは、外部の文字符号化情報がない場合である。例えば、電子メールで何かの情報を送信する場合、電子メールのヘッダで文字符号化スキームの名前を明示することができる。HTTPで送信する場合も同じである。これらの場合、実体の内部で符号化方式を明示することなく、安全に符号化方式を伝達できる。つまり、その場合は実体をテキスト宣言で始めなくてもよい、ということである。

 もう1つの条件は、UTF-8またはUTF-16以外の符号化を用いていることである。UTF-8またはUTF-16の場合は、前の段落の規定により、マークによる識別が可能なので、符号化方式を明示する必要は必ずしもない。つまり、実体をテキスト宣言で始めなくてもよい、ということである。(次ページへ続く)

  1/3

 Index
やさしく読む「XML 1.0勧告」 第28回
文字符号化の問題に決着を付ける
Page 1
・実体における文字符号化の問題解決を探る
・サポートすべき符号化の規定
  Page 2
・符号化宣言のEBNFによる生成規則
・符号化宣言に記述する文字符号化スキーム名
  Page 3
・エラーとなる符号化のケース
・符号化宣言を含むテキスト宣言の例


連載 やさしく読む「XML 1.0勧告」


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間