第35回 要素や属性の名前に使用できる文字の規定 Page 1

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

川俣 晶
株式会社ピーデー
2005/7/6

文字クラスについて

主な内容
--Page 1--
文字クラスについて
名前とトークン再び
文字クラス(Character Classes)
--Page 2--
文字クラスのルール
--Page 3--
付録:リストの生成使い捨てプログラム

 前回は「A References(附属書A(規定)文献)」を読んだ。XML 1.0勧告は、それ単体で完結した文書ではない。いくつかの外部の文書に依存して、XMLというメタ言語を規定している。どのような文書に依存しているのか、そして、なぜ外部の文書を参照すべきなのか、それについて説明を試みた。「UFO=空飛ぶ円盤」という不謹慎な事例で解説を行ったが、そこにある「1次情報の価値」という問題は重要なので、心に留めておくとよいだろう。

 さて、今回は「B Character Classes(附属書B(規定)文字クラス)」を読んでいこう。ここは、XMLの利用者であればだれでも関係のある名前文字の種類を規定している。つまり、要素や属性の名前に使用してよい文字と、使用してはならない文字の区別を具体的に規定している部分である。これは単なる文字の表ではなく、Unicodeの文字データベースと深いかかわりがある。それらについて解説を行おう。

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

名前とトークン再び

 本連載が始まって間もないころ、第5〜6回にわたり、名前とトークンについて読んだ。例えば、名前(生成規則[5] Name)とは、要素や属性の名前の書き方のルールであり、名前トークン(生成規則[7] Nmtoken)とは、NMTOKEN型の属性値の書き方を定めるルールであった。

 これらは、主に以下の生成規則によって、規定されていた。

[4]    NameChar    ::=    Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender
[5]    Name    ::=    (Letter | '_' | ':') (NameChar)*
[7]    Nmtoken    ::=    (NameChar)+

 さて、第5〜6回の時点でこの生成規則を完全に理解することはできなかった。なぜなら、この生成規則から参照されている生成規則のLetter、Digit、CombiningChar、Extenderについての定義がこの時点ではまだ出現していなかったからである。そして、それらはずっと説明されることなく放置状態になっていた。要素や属性に使用してよい文字とは、あらゆるXMLユーザーに密接に関係する重要な問題であるにもかかわらず、ずっと放置されてきたのである。

 しかし放置はここで終わる。

 長らくお待たせした!

 いまこそ、その生成規則をここに示すことができるのである。

文字クラス(Character Classes)

 それでは、AppendicesのCharacter Classes(文字クラス)を読み始めよう。といっても、大半は文字番号のリストに費やされており、文章は少ない。

 文字番号のリストの扱いについては大いに悩んだ。番号のリストを見ても、それが何を意味するのか直感的に理解できないためである。もちろん、番号で文字を示すというのは、このような技術仕様文書では有益な選択である。例えば日本語の文字についての規定を読むとき、読み手のPCに日本語フォントがない場合、日本語の文字は「?」マークなどに置き換えられて表示され、個々の文字を区別して識別することができない。しかし、番号で表記されていれば、フォントの有無に関係なく、文字の違いを識別することができる。また、似て非なる文字の区別も完ぺきに行うことができる。カタカナの「ヘ」とひらがなの「へ」など、よく似た文字はあるが、日本語に親しんでいない読者どころか、生粋の日本語ネイティブスピーカーですら見誤ることがあるだろう。しかし、番号を使えば識別は容易である。厳密さという意味では、番号による表記は非常に優れている。

 しかし、概要を把握したい場合には、番号による表記はあまり扱いやすくない。そこで、筆者は悩んだわけである。直感的な分かりやすさは放棄し、その番号の文字が許される、とだけ述べて飛ばしていこうかとも思った。しかし、それでは読者には何の印象も残らない。逆に、徹底的に個々の文字がどのような文字であるかを説明するという選択もある。つまり、それぞれの番号の文字が具体的にどの文字を示すかを克明に説明するのである。たとえその文字を表示するためのフォントが読者のPCにないとしても、それがどのような文字かを文章で説明すれば分かるだろう。しかし、リストに含まれる大半の文字は、おそらく筆者には理解できない他言語の文字であり、それらはおそらく大半の読者には使う機会がないものだろう。そのような文字に労力を注ぎ込むことは建設的ではないと考えた。

 今回は、妥協点として、番号を文字に置き換えた文字リストを作成した。文字に置き換えてしまえば、見ることによって直感的にどのような文字が対象となっているかが分かるだろう。もちろん、このようなリストは厳密ではないが、概要を把握するには有用である。もし、厳密な確認が必要であれば、生成規則に書かれた数値をチェックすればよい。

 もちろん、このやり方には問題がある。リストに含まれているすべての文字を表示できるフォントがない場合に、リストの表示が不完全になってしまうのである。しかし、実用上、それは重大な問題ではないと判断した。なぜなら、ある利用者が使う可能性のある文字をすべて含んだフォントを、彼/彼女は持っていると考えられるためである。そのフォントを使って閲覧すれば、少なくとも彼/彼女が必要とする範囲の文字についてはチェック可能である。

 では本文を読み始めよう。

Following the characteristics defined in the Unicode standard, characters are classed as base characters (among others, these contain the alphabetic characters of the Latin alphabet), ideographic characters, and combining characters (among others, this class contains most diacritics). Digits and extenders are also distinguished.

Unicode標準に定義するプロパティに従って、文字は基底文字(BaseChar)(これらは、ラテンアルファベットのアルファベット文字を含む。)、漢字などの文字(ideographic)および結合文字(CombiningChar)(このクラスはほとんどのダイアクリティカルマークを含む。)にクラス分けする。10進数値(Digit)およびエクステンダ(Extender)のクラスもある。

 ここで注目すべきは、Unicode標準に定義するプロパティに従うという記述である。ここでは、文字をいくつかに分類しているが、その根拠はUnicode標準にあるという。具体的にいえば、ここでいうUnicode標準とは、Unicode 2.0であることが、後の文章で明確に示されている。そして、Unicode 2.0の定義に従い、文字をクラス分けしているわけである。ここでいうクラス分けとは、学校で新学期に行う「太郎くんは1年1組に、花子ちゃんは1年2組に入れよう」という作業ではなく、文字を分類することをいう。具体的に、ここでは5種類に分けている。

 以下、すでに述べた文字リストをそれぞれの名前からリンクしてある。フォントがなければ表示できない問題があることを踏まえつつ、文字リストを見ると直感的に把握しやすいので、クリックしてみていただきたい。

 まず基底文字(BaseChar)。これは、欧米の言語のアルファベットや、ひらがな、カタカナ、ハングル文字などを含む。

 次は漢字などの文字(ideographic)。文字どおり、主に漢字を集めたものであるが、もちろん日本以外の国で使われる漢字も含まれる。

 結合文字(CombiningChar)は、複数のコードを結合して1つの文字を表現するために使用される文字である(サロゲートペアのことではないことに注意)。例えば、結合用のサーカムフレックス アクセント(U+0302)は、結合文字に含まれるが、これを「A」の後に記述すると、「Â」(サーカムフレックス付きラテン大文字「A」)を記述したことになる。

 10進数値(Digit)は、10進数の値を記述するために使用される文字である。慣れ親しんだアラビア数字(0〜9)以外に、ほかの言語で使われる同等の文字も含まれる。

 エクステンダ(Extender)は、 同じ文字が続くことを示す文字である。例えば「々」などがこれに含まれる。

 次は、コードの表である。しかし、このコード表を読む必要があるのは、厳密に特定のコードが含まれるかをチェックする場合や、XMLプロセッサを実装する場合に限られるだろう。

Characters
[84]    Letter    ::=    BaseChar | Ideographic
[85]    BaseChar    ::=    [#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | [#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | [#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | [#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | [#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | [#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | [#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | [#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | [#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | [#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | [#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | [#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | [#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | [#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | [#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | [#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | [#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | [#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | [#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | [#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | [#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | [#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | [#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | [#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | [#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | [#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | [#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | [#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | [#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | [#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | #x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | #x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | #x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | [#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | [#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | #x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | [#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | [#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | [#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | [#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | [#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | #x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | [#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | [#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | [#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | [#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]
[86]    Ideographic    ::=    [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]
[87]    CombiningChar    ::=    [#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | [#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | [#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | [#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | #x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | [#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | [#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | #x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | [#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | [#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | #x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | [#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | [#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | [#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | [#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | [#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | #x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | [#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | #x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | [#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | [#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | #x3099 | #x309A
[88]    Digit    ::=    [#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | [#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | [#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | [#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]
[89]    Extender    ::=    #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | [#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]

 すでに述べたとおり、上記のリストは、以下の文字表で(フォントのある範囲について)文字のリストとして見ることができる。

 フォントがあるにもかかわらず、Webブラウザでそのフォントを使用して表示できない場合は、ファイルに保存したうえで、フォントを自由に変更できるワープロソフトなどに読み込ませて、フォントを切り替えつつ見るとよいだろう。(次ページへ続く)

  1/3

 Index
やさしく読む「XML 1.0勧告」 第35回
要素や属性の名前に使用できる文字の規定
Page 1
・文字クラスについて
・名前とトークン再び
・文字クラス(Character Classes)
  Page 2
・文字クラスのルール
  Page 3
・付録:リストの生成使い捨てプログラム


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


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

注目のテーマ

HTML5+UX 記事ランキング

本日月間