vi 言語と文字集合

Contents

このガイドラインの使用者が符号化しようと望みうる文書はあらゆる種類の資料を包含している。それは潜在的には人間の書記言語・口頭言語の全領域において表現されたものであり、絶滅した言語、現存しない言語、推測された言語を含む。この範囲の広さから、しばしば当然のものと受け止められている言語学的情報の表示に関する二つの特定の側面に特別な注意が払われてきた。言語の識別と文字エンコーディングである。

単一の文書の中でさえ、多くの異なった言語による資料に出会うことがある。人間の文化、そしてそれを具体化するテキストは本来的に多言語的であり、そうではなくなるような兆しを見せることはない。伝統的な文献学者と現代の計算言語学者は等しく多言語の世界ではたらいているが、その中で異なった言語システムを(言語学的な意味で)コードスイッチングで正確に表示することは規範を設けるのであって、例外を設けるわけではない。危機言語の記録とドキュメンテーションにおいて最も顕著であるが、言語学的多様性に関する研究において現在ますます増加している関心事は、この長年の伝統のひとつの側面である。この歴史的な重要性のために、このようなガイドラインと勧告を記述する際には、危機言語のニーズ、そして絶滅言語のニーズをも、考慮に入れなければならないのである。

人間の言語は、そのたいへんな数と多様さ以上に、それらの書記形態において、甚だしく多様な文字体系あるいは書記システムを展開していることがあるということを忘れてはならない。これらの文字体系は同じく小さな単位から構成されている。その単位を簡便のためにここでは文字と呼ぶこととする。テキストを符号化する際の初期の目的は、後にその使用者が、言語と文字体系、そして構成要素となる文字のいずれをも正しく識別するのに十分な情報を捕捉することであるべきである。この章では、この要件に向かい合い、ある文書あるいはその一部の中で使われている言語・文字体系・文字を指示するために推奨された機能を提案する。

言語の識別はvi.i 言語の識別で扱われる。要約すると、ある言語にとって定義済みの識別子が利用可能な場合には、それらの使用を推奨している。それらは、ますます増加しつつある言語特有のソフトウェアとますます増加している言語のドキュメンテーションへの関心との一対のプレッシャーの結果として、ある部分においてますます利用可能になっているものである。そのような識別子が利用可能でない場合、あるいは標準化されていない場合には、このガイドラインは言語識別子とその意味を、他のメタデータがTEIヘダーで記述されているのと同じ方法で記述するという方法を推奨している。

文字と文字体系を表示するために利用できる手段の標準化は、このガイドラインの最初のバージョンの発表以来、かなり移ろいを見せてきた。当時は、ほとんどどの電子資料によっても使用されていた文字と符号化文字集合を明示的に記述することが、それがもし異なったコンピュータープラットフォームや環境に渡って用いられる機会があるならば、必要不可欠であった。しかしもはやそうではない。ユニコード標準 (Unicode Consortium (2006)) が利用できるようになって、ほとんど全世界の現行の書記システムを表示するほぼ100,000の異なった文字が利用可能であり、どんなXML処理環境においても堅苦しさなしに使用可能である。それにもかかわらず、標準化された文字がどれほど多くなっても、とりわけ歴史的資料において、しかしそれだけには限らず、非標準の文字とグリフを使用する文書を符号化する必要は常にあるであろう。その上、ユニコードの豊かな可能性は、ガイドラインの使用者が出会いそうなどのソフトウェアにおいてもまだ実現されてはいない。したがって、この章の第二節ではこの標準の底流にある概念と慣習をいくらか詳細に論じ、それをこえて拡張するために利用可能な手法を紹介する。より十全には5 標準化されていない文字と字形の表現において論じられる。

vi.i 言語の識別

文書あるいはその一部が記述される言語の識別は、電子文書にとって想像される多くの使用法にとって決定的な要件である。したがって、TEIは以下の方法でこの要件に応えている。
  • グローバル属性xml:langはすべてのTEI要素に対して定義されている。その値は使用されている言語を識別する。
  • TEIヘダーにはある文書において使用されている言語に関する情報のために保留されたセクションがある。詳しくは2.4.2 言語を参照。
xml:lang属性の値は符号化された値を使用して言語を識別する。この属性の値は言語を識別するものであるが、言語と地域的方言を表示するために使用される文字体系を含むことができる。その言語はそれが明記されている要素の内容において使用されるものである。
  • 言語に対する識別子はBCP 47において構成されている通りに構成されるべきである。27
  • もし対応するlanguage要素がTEIヘダーにおいて存在しているならば、その時にはこの同一の識別子はそのident属性を通して上述のlanguage要素を識別するために使用されるべきである。
BCP 47の構成要素のひとつがRFC4646のTags for Identifying Languagesである。それはInternet Assigned Numbers Authority (IANA) によって管理されたものとしての言語識別子 (タグ) を構成するために以下のような機能を提案している。タグはハイフン文字 (-, U+002D) によって区切られた一連の構成要素あるいは下位タグから組み立てられる。タグは以下の順に以下の下位タグからなる。最初のものを除く各々の下位タグは任意である。もし存在する場合、反復可能な第四と第五の構成要素 (異体と拡張) を除いて、それぞれ一度だけ現れる。
言語
IANAに登録された言語コード。これはISO639 二文字言語コードがひとつある場合、それとほとんど必ず同じである。利用可能な登録言語下位タグのリストはhttp://www.iana.org/assignments/language-subtag-registryにおいて見ることができる。このコードは小文字で書くことが推奨されている。
字体
ISO 15924の文字体系コード。これらのコードは四文字よりなり、最初は大文字で、他の三文字は小文字で書くことが推奨されている。コードの基準的なリストはユニコードコンソーシアムによって維持されており、http://unicode.org/iso15924/iso15924-codes.htmlで利用可能である。IETFは、必要な区別をするために不可欠でなければ省略することを推奨している。
地域
IANAで登録されているISO 3166の国コードあるいはUN M.49の地域コード (そのようなすべてのコードが登録されているわけではない。e.g. 経済的分類のためのUNコード、あるいは既にISO 3166 二文字コードのある国々のコードは登録されていない。) 前者は二文字よりなり、大文字で書くことが推奨されている。コードのリストはhttp://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/index.htmlで見ることができる。後者は三文字よりなり、コードのリストはhttp://unstats.un.org/unsd/methods/m49/m49.htmで見ることができる。
異体
IANAに登録された異体。これらのコードは「他の利用可能な下位タグによってまかなわれない言語あるいはその方言を定義する付加的で十分認知された異体を指示するために使用される。」
拡張
拡張は付加的な下位タグの後続するハイフンの後続する一文字の形式をもつ。これらはBCP 47へのさらなる拡張を見込んで存在するが、今現在そのような拡張は使用されてはいない。
私用
xという一文字を最初の文字として使用する (つまりx-で始まる) 拡張は関係している集団間で交渉されるものとして以外には無意味である。これらは大いに配慮して使用されるべきである。RFC 4646の使用がそれを推進しようと意図されている相互利用可能性を阻害してしまうからである。これらの下位タグを使用する文書がTEI準拠であるためには、対応するlanguage要素がTEIヘダーの中に存在しなければならない。

上記の形式に対して二つに例外がある。第一に、IANA registryの中にはRFC 4646の構文に合致しない言語タグが存在するが、それらは以前の規格から‘受け継がれ’てきたために存在しているのである。これらは三十あまりあるが、そのうち八つにはその代わりに使用されるべき新たな推奨された値がある。e.g. ナバホ語をi-navajoと符号化することはいまだ許容されている一方で、優先される符号化はnvである。

第二に、全言語タグは私用下位タグのみから構成されうる。これらのタグは-xで始まり、それ以上はIETFによって制定されたルールやこのガイドラインによって推奨されたルールにしたがう必要はなく、むしろこれらのタグを使用する、その文書と作成と消費に関係する集団によって同意されたルールにしたがう必要があるのみである。しかしながら、私用下位タグを使用するすべての言語タグと同様、当該の言語はTEIヘダーの中の対応するlanguage要素の中で記述されなければならない。

言語タグの例、ほとんどがRFC 3066からとられたもの

  • 単純な言語コード

    • de (ドイツ語)
    • ja (日本語)
    • zh (中国語)
  • 言語タグ + 字体

    • zh-Hant (中国語・繁体字)
    • en-Latn (英語・ラテン文字)
    • sr-Cyrl (セルビア語・キリル文字)
  • 言語-字体-地域

    • zh-Hans-CN (中国語・簡体字・中華人民共和国)
    • sr-Latn-891 (セルビア語・ラテン文字・ セルビア・モンテネグロ)
  • 言語-地域

    • zh-SG (中国語・シンガポール)
    • de-DE (ドイツ語・ドイツ)
  • その他

    • zh-CN (中国語・中国・字体なし)
    • zh-Latn (中国語・ラテン文字転写)
  • 私用

    • x-mb (創作言語)
    • de-CH-x-phonebook (ドイツ語・スイス・電話帳照合順序)
    • zh-Latn-x-pinyin (中国語・ピンインによるラテン文字転写)
ここで行った大文字化は慣用にしたがっている (e.g. 国コードは大文字、言語コードは小文字) ということは注意すべきであり、BCP 47は意味を大文字化の差異に帰してはいない。

このシステムは拡張可能であるから、上述の構成物は世界のいかなる地域の、過去あるいは現在のいかなる言語に対しても識別子を作り出すために使用することができる。もし私的拡張 (つまりx-下位タグをもつタグ) がTEIの文脈の中で使用されるならば、それはTEIヘダーの中のlanguage要素の中で記述されるべきであるが、それは言語タグによって解説されたその言語の散文解説を提供するかもしれない。

言語・字体・地域はこの機能を使用することで充分に識別することができるが、ある文書の言語にとってはある程度の時間を表現するための大まかな規定だけがある。規定されているそのコード (e.g. ‘ギリシャ・古代 (1453まで)’に対するgrc) は手元にあるテキストにとってふさわしい区分を反映していないかもしれない。ある言語の時間窓を表現するためのひとつの機能は、以下の例のように、私用下位タグとdateを含むTEIlanguage要素を使用することである。

<!-- in the TEI header --><language ident="en-US">Modern U.S. English</language>
<language ident="en-US-x-colonial">U.S. English as spoken during
the <date notAfter="1776">colonial period</date>
</language>
<!-- in the body of the text -->
<quote xml:lang="en-US-x-colonial">... you are upon your Passage or upon
the Coast as you may think proper to draw up some more Particular
&amp;amp; General orders for the well Conducting &amp;amp; Security of our
Interest onboard yr Brigg that is in Particular to appoint &amp;amp;
Authorise any of your Officers onboard or Such other persons as you
may think proper to take the Command of our Vessel &amp;amp; Cargo and
to follow your orders In Case anything shod happen to you as shold
render you InCapable of doing the Buisness of the Voyage &amp;amp; in
genl to remove any officer onboard &amp;amp;appoint any other officer
or officers to act in yr sted during the voyage in which Case You'l
order the Vessel to first touch at Barbadoes, from the Coast, where
she may meet our more Particular Instructions for the better
Government of the Voyage</quote>
<!-- ... -->

他の典拠によって言語識別子に相当させることは、languageセクションにおいてもできるが、そうするための公式な機能は定義されていない。

言語の識別の範囲は、xml:lang属性をもつ要素に据え付けられた文書の下位ツリー全体にわたっている。ただし、下位ツリーの中の子孫要素にあるxml:langインスタンスで上書きされていない場合である。この範囲は要素の内容と‘テキストの’属性、つまりある言語が適合しうるそれらの属性、の値の両者を含んでいる。28

vi.ii 文字と文字集合

文書のエンコーディングはすべて同意をえた組織的な方法であるものを別のものによって表示することと関係している。与えられた書記システムにおいて特有の最小単位、さしあたって我々がゆるやかに‘文字’と呼ぶもの、に対してそのような表示を適用した時、それは驚くべきほど複雑で困難な問題を提起する。その理由はある部分では歴史的なものであり、またある部分では自然言語の文字を識別し、符号化し、処理し、表現するということに伴うことがらに関する概念的不明瞭さに関わるものである。

歴史的考察

コンピューターの開発よりはるか以前、機械によって保存あるいは伝達するためにテキストを表示する最初の方法が考案されたとき、最優先の目的は、本質的な意味内容を伝えるために必要とされる記号の最小の集合を識別し、その記号の集合を保存あるいは伝達媒体が許容する最も経済的な方法で符号化することであった。その最初の産物が、大文字ラテン文字、そしていくつかの句読点と‘制御文字’という保存・伝達装置を制御するために必要なもので表現されうるような内容のみを符号化するシステムであった。そのようなエンコーディングは、もともとは電信のために発展したものであったが、コンピューターの先駆者たちのテキスト操作の考え方や実装の仕方に強く影響を与えたのであり、それは今日なお続いているのである。

コンピューターの発明以来長年にわたって、そのテキストの表示方法は、高価なリソースを最大限効率的に使用するという要請によって制約を受け続けてきた。保存と処理のコストが劇的に下落しはじめたときでさえ、ほとんどのハードウェア設計者とソフトウェア技術者の英語中心的な見地のために、テキストの表示に対するより寛大で柔軟なモデルを率先して考案しようとすることはなかった。‘レガシー’なデータとの互換性を維持しようとする願望がその意欲を阻害する付加的な要因であった。結局は、技術的進歩への関与とローカルな書記システムに対処する現存コンピューターの無能さとの間の東アジアにおける緊張状態が、決定的な進展へとつながったのである。日本・韓国・中国の標準化組織という、コンピューターの出現よりはるか以前に文字集合の規格に携わってきた者たちが、それらの文字集合を数で表されたエンコーディングに対応づけ、その結果としてのテキストデータを処理する方法を考案するために、コンピューター製造業者とソフトウェア会社と行動を共にしたのである。

不幸なことに、はじめの数年間においては、関係している各国の標準化組織や製造業者間での共同関係がほとんどあるいは全くなかった。その結果、商業的必要性がこれら様々なローカル標準がすべてアメリカ英語の表示との互換性をもっていることを要求したけれども、それらがお互いまっすぐに互換性をもっているわけではなかった。日本自体の中でさえ、相互に互換性をもたない数多くのシステムが出現した。それは、商業的な競争と、いくらかのインタラクティブな問題をいかにうまく扱うべきかということに関する意見の相違と、そのような先駆的な仕事がいくらかの誤った出だしを含むことが不可避であるという事実とが混じりあった結果であったし、またそれは同じ組織の連続した成果物間でさえ互換性をもたないことをもたらしてしまったのである。おおよそ同じ時に、そして同様の理由で、キリル文字を使用する言語を表示する複数の互換性をもたない方法が考案されたが、それは基本的なラテン文字とは別の書記システムとの互換性を目指せないことが不可避である古い書記システムを符号化する手法に沿ったものであった。TEIに入り込んだ最初期のプロジェクトの多くは、コンピューター化されたテキストの表示の開発段階において形づくられたものであり、またそれはSGMLが考案され、完成された文脈でもあった。

当然、SGMLは複数の表示における複数の書記システムを処理する方法を提供しなければならなかった。いやむしろ、そのような複数の表示を処理することのできるSGML対応のソフトウェアを (学界ではめったに見出せないような) 十分な財政的・人的資源をもつ人々が開発しうるフレームワークを提供した。このガイドラインの以前の版は、SGMLが唯一の実行可能な選択肢であった人々の状況に向けられた文字集合と書記システムの問題に関して助言を与えていた。その助言は今や密接に関係する二つの発展によって実質的に変更されなければならない。二つの発展とは、国際標準としてISO/ユニコード文字集合が利用できることと、ユニコードが具体化する文字表示の理論と慣習に関与しているXMLおよびその関連技術の出現である。

用語法とキー概念

ユニコードの意味と、XMLとユニコード間の協力の言外の意味を充分に説明する前に、いくつかのキー概念を明確にし、それらに対して充分に正確な用語法を確立しようとすることが必要である。

例 of the small latin a rendered with different fonts.
異なったフォントで表現された小文字ラテン文字aの例

‘文字’という語はそれ自体、用語法的な正確さに我々を導いてくれるというものではない。それは、あるページ上の可視の記号と、その記号が表示する字あるいは表意文字という両者を区別することなく指示するために使用される傾向にあるが、その二つは概念的に区別しておくことが不可欠なものである。可視の記号は、我々がそれを他の文字ではなくある文字を表示するものとして解釈するためのいくつかの様相を明らかにもっているのであるが、その見た目は、それが表示するある書記システムにおけるその文字に関する我々の観念に全く影響を与えることのない諸々の素性によってはっきりと確定されうるのである。身近な実例は小文字aである。印刷されたテキストにおけるそれは‘一階建て’の記号 (cf. 図表1 Baskerville SemiBoldあるいはCenturyの例) でも、‘二階建て’版 (図表1 ArialRegularあるいはAndale Mono Regularの例) でも表示しうる。一階建ての記号も二階建ての記号も全く同一の抽象文字aを二つの異なったグリフを使用して表示しているといえる。同様に、セリフ体の大文字Aには、サンセリフ体を使用して印刷されたときにはないストロークがある。その結果として、もう一度同じ抽象文字を表す異なったグリフを我々はもっているのである。図表1では、小文字aが大文字Aに典型的なグリフのように見えるCapitals Regularというフォントさえある。抽象文字とグリフとを区別することは、文書を処理するすべての機械に必須なのである。

ほとんどの学術的エンコーディングプロジェクトにおいては、テキストを構成している抽象文字を正確に記録することは最も重要なことである。それは、意味論的損失なしに文書を電子化し、処理するのに不可欠な必要条件であるからである。多くの場合 (ただし簡単に触れことになるが重要な例外がある)、元文書の中でそれらの抽象文字を表現するために使用されている特定のグリフを符号化することは不可欠ではないこともある。ある文書の抽象文字を誠実に登録するエンコーディングがあれば、我々は自分たちの文書の内容・言語構造を検索し分析し、さらにはその充分な意味論にアクセスすることもできる。しかしながら、その同じエンコーディングは、元テキストあるいはマニュスクリプトにあるグリフの正確な視覚的表示を再現できるだけの充分な情報を含んでいないこともあるのである。

情報の内容とその視覚的表示との間にあるこの相違の重要性は、機械によるテキスト処理に特有の複雑さに慣れていない人々にとっては、必ずしも直ちに明らかなことではない。そのような使用者はまず「どうすれば文字xのように見える物理的イメージをスクリーンや出力されたページに出すことができるのか。」という(概念的優先順序では) 彼らにとってのまさに最後の質問であることを尋ねがちである。彼らにとっての最初の質問は実際「普遍的かつ一義的に識別可能であるような方法で、どうすれば文字xの抽象表示を私の符号化文書に入れることができるのか。たとえプリントアウトや特定のディスプレイでどう見えようともである。」であるはずである。そして、見当違いの最初の質問の結果として受け取った返答というのは、時に、彼らの直ちに表現したいという願望を満足させるあつらえの‘解決策’であっても、その代償として、抽象文字を奇異な方法で符号化してしまうから、他の使用者に (あるいは別の時と場所にいる元使用者にさえ) 理解できない潜在的な文書を作り出してしまうものである。

とはいっても、植字工や筆写者が意味論的に同等ではあるが視覚的に異なる代わりのものではなく、むしろある特定のグリフや一組のストロークを使用して与えられた抽象文字を表示しようと決めた、ということが学術的に重要なことがらであるような文書やプロジェクトは確かに存在するであろうし、その場合には、その形態の特定の見た目が某かの方法で符号化されなければならないであろう。しかし、そういうエンコーディングは、元のものに視覚的に類似している記法を伴う必要はない (し、ほとんどの場合今後もその必要はないであろう)。それは元文書にあるイタリック体のテキストがその符号化された版においてイタリック体の文字を使用して表示されないのと同様である。

ある与えられた書記システムで文書を表示するために必要とされる抽象文字コレクションは文字集合として知られている。そしてその文字集合、あるいは処理装置や表現装置の文字レパートリーは、その装置がそれを正確に認識し扱うために備えられている抽象文字集合である。しかしながら、同一用語のこれら二つのパラレルな使用の間には、それを把握するために不可欠なもう一つのキー概念に関わりつつ、微妙なちがいがある。ある文書の文字集合 (あるいはそれが記録されている書記システム) は純粋に抽象文字のコレクションである。しかし、ある計算装置の文字集合は、それによってその装置がそれらの抽象文字を内部的に表示するために、ある数あるいはコードポイントの集合にうまく定義された方法で対応づけられたたある抽象文字集合である。したがって、それは符号化文字集合として言及されることもあり、それは、当該の文字を一義的に識別する、数で表されたコードポイント (あるいはある場合にはコードポイント列) を各々が割り当てられたある抽象文字集合を意味している。

今やユニコードとは何かをのべるためにこの用語法を使用することができる。それは符号化文字集合という、国際的公共組織によって考案され、活発に維持されているものである。そこでは各々の抽象文字が一意の名称によって識別され、特有のコードポイントを割り当てられている。29 ユニコードは他の先行する、あるいは共存している符号化文字集合と、その (現在のあるいは潜在的な) 大きさと範囲という点で異なっている。(実用的にいえば) 無限の拡張に対するその組み込みの規定、それが引き出している言語学と計算学の専門的知識の範囲と質、すべての重要な世界中のハードウェア・ソフトウェア提供者その実装への原則的 (そしてますます実用的) 参加、そして国際的公共基準としての社会的状態から得たその安定性、権威、アクセシビリティである。

抽象文字、グリフ、エンコーディングスキームデザイン

抽象文字とグリフ間の相違は、エンコーディングスキームを考案する際に、きわめて重大でありえる。テキスト検索を実行したり、探査したり、コンコーダンスを作ったりしている使用者は、そのシステムに異なったグリフを同じ文字の実体として認識し、取り扱うことを期待するであろうが、テキストそれ自体を精読する際には、保存され表示されているグリフの異体が見えることを都合よく期待するかもしれない。既存のあるテキストを符号化する時、符号化する人はある特定の文字や記号がある文字やグリフの異体であるかどうか確定しなければならない。文字とグリフの関係の詳細なモデルは、ユニコードコンソーシアムとISOワークグループ (ISO/IEC JTC1 SC2/WG2) の中で開発されてきた。その報告 (Unicode Technical Report 17: Character Encoding Model) ははるか将来の標準化作業の基礎を形成するであろう。

そのモデルは書記言語の構成要素の二つの異なった素性間の相違を明確にする。
  • それらの内容、つまり、その意味と音価 (文字によって表示されている)
  • それらの記号上の外見 (グリフによって表示されている)

情報を探査する時、あるシステムは一般的に、外見にほとんどあるいは全く配慮することなく、文字の内容面に影響を及ぼす。他方、あるレイアウトやフォーマット処理は、必然的に文字の正確な外見に関わらなければならない。もちろん、いくつかの操作 (たとえばハイフネーション) は両種の素性に注意を要するが、一般には、このガイドラインに記述されているその種のテキストエンコーディングは、外見よりもむしろ内容に焦点を合わせる傾向にある。(詳しくは3.3 強調部分と引用を参照)

どのグリフがある与えられた文書に存在するのかということに関する情報を記録しようと望んで符号化する人は、次の二つの段階の一方あるいは両者でそうするのかもしれない。
  • 文字エンコードの段階、当該のグリフを表示するために適切なユニコードのコードポイントを使用して
  • マークアップの段階、適切な要素と/または属性を通して指示されたグリフを用いて

採択されているエンコーディングの慣習は、他のものの中でも、符号化されたテキストが使用されるであろう最も頻度の高い使用の評価によって左右されることもありうる。例えば、もし多様なグリフで表示された同一の文字の識別が最優先であるならば、マークアップの段階でグリフの異体を表示することが賢明であることもある。その結果として文字価を直ちに索引作成と検索のソフトウェアに触れさせることができるであろう。率直に言えば、エンコーディングプロジェクトはそのような問題を注意深く考慮し、その思案の成果を、ローカルの手順マニュアルの中でエンコーディングの一貫性を確保するために、具体化する必要があろう。グリフ情報を表示するためにユニコードのコードポイントを使用することは、そのような選択がTEIヘダーの中で記述されていることを要求する。そのようなドキュメンテーションは、それ自体、望ましいグリフの適切な表示を保証することはできないが、少なくとも符号化する人の意図を発見できるようにはしてくれる。

現在、ユニコード標準はグリフの異体の符号化に対して詳細な規格を提供しない。このガイドラインはいくつかの勧告を与えている。関連することがらに関するいくつかの議論が11 Representation of Primary Sourcesで行われている。また、5 標準化されていない文字と字形の表現は異体グリフの定義のためにいくつかの素性を提供している。

文字エントリー

テキストの文字は、三つの方法のどれかを使用して、いずれかの便利な組み合わせで、ある文書の中に入力されうる。第一に、ふさわしい入力手段がこれを可能とする場合、普通のキーストロークによってであれ、表意文字の入力のために一般に使用されているインプットメソッド (IME) の一つによってであれ、当該の文字は直接その文書の中に入力されうる。これは、テキスト入力のために使用されるディスプレイ及び/あるいは校正を目的として出力を作るために使用されるプリンターが正確で容易に識別可能なグリフを使用して当該の文字を表現できる場合には、最も便利そうである。そのように容易に検査できる表現が利用できない場合、あるいは、直接ある文字を入力するふさわしい手段がない場合には、間接記法あるいは‘参照’という二つの可能な形態の一方で入力されうる。

その一つ目の形態が数値文字参照 (NCR) である。それは&#D;Dは文字のコードポイントを表示する10を底とする整数)あるいは&#xH;Hは16進法のコードポイント)という一般形をとる。これは、その文書の実体あるいは関連付けられたスキーマのどこかでこの記法が何を意味しているのかを宣言することが全く要求されないという利点をもっている。どのXMLプロセッサでも、いかなる付加データにもアクセスする必要なく、NCRを認識しそれらを要求されたコードポイントの値と置換することができるのである。NCRのもつ文字データ入力・表示・校正手段としての欠点は、ほとんどの人間にはそれらを‘可読である’とは決して思われず、あまりにも容易に誤った文字が間違って入力され、見つけられないままになってしまうことである。

二つ目の参照形態は文字実体参照 (CER) である。ただし、以下に説明するように、これはそのような実体が、処理システムがそれを他と区別して認識することのできるある‘タイプ’を構成するということを含意するととらえるべきではない。文字実体参照は、その意味が人間にとって明らかな名前をもつことができる (そして実際そうすべきである) が、それぞれどの実体名も、その文書の内部あるいは外部のサブセットの中の正式な宣言を通して、その代替物 (以下に説明するように、できる限りNCRの形の、文字価であるべきである) と関連づけられていなければならない。文字がユニコードによって定義され、文書の中で一般に使用されている多くの文字に対して、可能な場合に使用されるべきニーモニック名を宣言するISO実体集合がある。ISO名を使用しそのサブセットに含まれるのにふさわしいXML互換文字実体宣言はTEIウェブサイトのhttp://www.tei-c.org/XML_Entities/で利用可能である。

文字がユニコードで定義されておらず、そのためプロジェクトの選択 (以下のXML文書における非ユニコード文字を参照) によるローカルなコードポイントとローカルな実体名の両者を割り当てなければならない場合、ISOと同じ命名原理にしたがい、その文字にある一意の記述名を与える文字列をその実際の実体宣言へのコメントとして付加するISOの文字実体宣言における慣習を見習うことが非常に望ましい。加えて、異なったグループあるいはプロジェクトが地理的・歴史的・言語的あるいはその他の、文字エンコーディングの共通の問題をおこす類似性のあるテキストに取り組んでいる場合、実体名を考案するときにお互いに相談することは一貫性のためには非常に賢明である。TEIメーリングリストはそのような相談にふさわしい最初の接点を提供するかもしれない。ローカルに定義された文字の問題に関するさらなる助言は5 標準化されていない文字と字形の表現に含まれている。

TEI: 文字の出力

符号化テキストを表現することは、目的、外的要件、ローカルな準備などに大いに依存する複雑な処理である。したがってそれはこのガイドラインの及ぶ範囲外である。

しかしそれにもかかわらず、この章の議論の文脈に、表現するという処理に使用されている用語法のいくつかを置くことは有用であるかもしれない。上述したように、ユニコードは抽象文字を符号化するのであって、特定のグリフを符号化するわけではない。しかしながら、文字を可視にするどんな処理にとっても、具体的な、明確にデザインされたグリフの形が使用されなければならない。例えば、印刷処理にとってこれらの形は、紙のどの点にインクをつけなければならないか、そして、どの領域が空白のまま残されなければならないかを正確に記述する。もしラテン文字からある文字を印刷しようとするならば、全体のグリフの形の選択に加えて、この処理はそのフォントのある特定のウエイト、ある特定のサイズ、そしてどの程度その形を傾斜させるべきであるのかということを選んでいなければならない。個々の文字以上に、全体の組版処理もまた、どのように文字の間隔を計算すべきか、単語間の空白はどの程度か、どの点に改行は起こりうるのか、などという特定のルールにしたがっているのである。

もしこれら他のすべての要因を除外して文字自体を表現する処理のみに関わるならば、この処理に要求されるすべての情報のうちほんの少ししか符号化されたテキスト自体から引き出されることはないであろう。この情報とは、その文書において文字を符号化するために使用されたコードポイントである。この情報を用いて、印刷のために選択されたフォントに対して、この文字に対してあるグリフの形を提供するよう問い合わせがなされるであろう。いくつかの現代のフォント形式 (e.g. OpenType) はあるコードポイントからその選択されたグリフへの洗練された対応づけを実装している。それは (必要な場合に合字をつくるために) 周りの文字や言語、あるいは、異なる組版伝統やグリフ使用の相違を調節するためにこの文字が印刷される地域さえも考慮に入れていることもある。

TEI文書はこの処理に必要とされる情報のいくつかを提供しているかもしれない。例えばxml:lang属性で言語的文脈を識別することによってである。フォントとサイズの選択は通常スタイルシートの中でなされるが、ページの実際のレイアウトは使用される組版システムによって決定される。同様に、もしある文書がWebでの公開のために表現されるならば、この種のものの情報はその文書とともにスタイルシートの中におくことができる。30

ユニコードとXML

XML標準の考案者は、ユニコードが準拠XMLプロセッサがサポートする義務をもつ、抽象文字を表示する唯一の手段であるべきであるという見解をとった。それは確かにXMLプロセッサによって扱われることになる文書における他の文字エンコーディングスキームや文字集合の使用を排除していないが、あるXML文書の中で文字として (マークアップを通して間接的に表示されているものとは異なって) 符号化されているすべての抽象文字が、公のユニコード標準の中に割り当てられたコードポイントをもっているか、あるいは、そのローカルなプロジェクトによって考案されそのプロジェクトに特有のコードポイント (この目的のために特別に標準によってとっておかれた予約領域、いわゆる私用領域つまりPUAからとられたコードポイント) を割り当てられているかのいずれかでなければならない、ということを意味しているのである。このガイドラインが適用可能なプロジェクトの大部分にとって、ユニコード標準はすでにそれらの文書が用いるすべての抽象文字に対するコードポイントを提供するであろう。そのことから、そのようなすべての文字がXMLプロセッサによってユニコードコードポイントに解決されるべきであるという要件は、PUAコードポイントのどんな定義や使用にも関わらないであろう。実際、そのようなプロジェクトはXMLを選択することによってユニコードを文書の中で使用することを強制されるわけではない。もし、彼らが使用する非ユニコード符号化された文字集合を必要なポイントで正しく宣言し、その宣言されたエンコーディングをすべてのXMLプロセッサがサポートすることを保証し、そしてその宣言に厳格に準拠して一貫してそのエンコーディングを用いるとすれば、彼らがそうするのが適切であると感じない限り、そしてそう感じるまで、ユニコードと意識的に関わる必要はないのである。

非ユニコード文字とXMLプロセッサー

しかしながら、準拠XMLプロセッサが文字集合がユニコードではない文書を扱う仕方には厳しい制限がある。これらの制限が理解されていないならば、まだ全面的にユニコードに関与する準備のできていないプロジェクトは、レガシーな文字エンコーディングを操作しようとするときに予期しない困った問題に陥ってしまうであろう。第一に、XML標準におけるいかなるものも準拠プロセッサに非ユニコード文書を処理することを要求することはない、ということは繰り返されなければならない。しかし、たとえそれを根拠に非ユニコード文書を処理することを拒むような実際のプロセッサがあったとしても、一見そう見えるほどひどくはその利便性を制限することはないであろう。その理由は、内部的にユニコードコードポイントを表示する方法があるからである。(詳細は以下のUTF-8に関連したエンコーディングエラーで説明される) その場合、実際に7ビットのみを用いるASCIIで符号化された文書と、ユニコードで符号化されてはいるが単に7ビットASCII標準に取り囲まれた抽象文字をたまたま含んでいる文書との間には、見つられるような違いは何もない。そして、XML標準は、ユニコードを表示するこの方法が、プロセッサがあるエンコーディングを明確に宣言していない文書にとってのデフォルトとして仮定しなければならないものである、ということを明記している。一挙にこの規定は、純然たる7ビットASCIIで符号化された文書をすべてあらゆるXMLプロセッサがさらなる苦労なく処理することができる、ということを保証しているのである。これに加えて、XML標準の中でもそうであるが、どんなユニコードコードポイントでも数値文字参照 (NCR) を通して7ビットASCII文字のみを使用して間接的に明記することを可能にしている規定とその結果は、7ビットASCII領域外のいかなる文字でもNCR記法でユニコードコードポイントとして書き換えるよう前処理することのできる (そのためのソフトウェアが容易に利用可能な単純なバッチ処理) 非ユニコードエンコーディングのすべての文書を、ユニコード以外のエンコーディングへの組み込みのサポートを全くもたないプロセッサによってさえ扱うことができるということである。

実際、これまで公開されたどのXMLプロセッサも、必須ではないけれども標準の中に明記された、少なくともいくつかの非ユニコード文字集合での文書の処理を許可する方法を実装してきた。そのようなプロセッサはそのドキュメンテーションの中にサポートする非ユニコードエンコーディングの宣言を含んでおり、そのようなエンコーディングを使用することがプロセッサに対して正しい方法で宣言されなければならない。

そのようなエンコーディングサポートを利用する時の混乱を避けるためには、あるXML文書の中のエンコーディング宣言が実際単純に宣言であって、それが後続の文書を当該のエンコーディングへと魔法のように変換する呪文ではない、ということを理解することがまず最初に必要である。単純にある文書のエンコーディングを例えばISO-8859-1 (あるいはそれならUTF-8やUTF-16でも、そのサポートが必須であるようなユニコード表示) であると宣言することが‘そうする’ために充分であると考えることは、共通の誤りである。そのような宣言は実際に後続する文書が宣言に準拠して厳格に符号化されなければ役に立たないものである。実際にはそのようなことにならないような状況のいくつかは、以下のユニコード内部表示から生じる問題において概説される。第二に、あるエンコーディング宣言はあるXMLプロセッサをその宣言が及ぶ限りそのエンコーディングで完全に動作するモードにどうにかして切り替えるわけではない。それどころか、その宣言されたエンコーディングのコードポイントをすべてユニコードの対応するものに直ちに変換するフィルタに入力を通すようプロセッサに指示するだけである。その時点以降、すべての後続する処理段階で見られるような文書は、たとえそのことが使用者にとって一見わからなくても、実際にはユニコードのものなのである。第三に、この不変の内部変換には決定的な帰結がある。あるプロセッサがある非ユニコードエンコーディングの文書をうまく受け取ることができるということが、その出力を元の宣言された入力エンコーディングに必ず変換するということを意味しない、ということである。内部的に、その文書がユニコードに変換され処理されたが、逆変換を出力段階で実行することを要求するものはXML標準には何もない。ほとんどのプロセッサは標準を越えて多様なエンコーディングで出力する手段を提供しているが、それが利用できるかどうか、どのように使用するのかということはそのプロセッサのドキュメンテーションから確認しなければならない。それが利用できないあるいは信頼できないとすれば、文字コンバータを通して元のエンコーディングを復元するよう後処理する必要があるかもしれないが、そのようなソフトウェアは自由に利用でき、使用するのも容易である。

XML文書における非ユニコード文字

前節において考えられたケースにおいては、入力文書の非ユニコード文字集合に含まれている各々の抽象文字に対応するふさわしいユニコードコードポイントがあった。そのような事例においては、プロセッサによって実行された必要な内部的なユニコードへの変換が、非ユニコード文字集合で作業を続けようと望む使用者にとって多かれ少なかれ明白でありうる。非ユニコード文字集合がユニコード標準におけるコードポイントをもっていないような抽象文字を含む時、あるいは、終始ユニコードでの作業を試みているあるプロジェクトが、ユニコード標準において現在のところ提供されていない抽象文字を表示する必要があるとわかった時には、事態はかなり異なってくる。ここではSGMLとXMLの間の重要な違いがかなり困難な仕方で浮かび上がってくるのである。

実装するのに相当より容易であるSGMLのサブセットを考案するための彼らの指針にしたがって、XML規格の著者たちは内部SDATA実体として知られているSGMLで利用可能なある特定の型の実体をXMLにもち越すべきではないと決定した。ここでその決定に異議を唱えることは無益であろうが、しかしユニコード定義のない抽象文字の扱いに対するその結果は重要であった。

我々がローカルに定義された抽象文字と呼ぶものを符号化し、処理し、交換するためにこのガイドラインの以前の版で推奨された手順は、SDATA型のものとして宣言された実体を利用できることに頼っていたが、その型はXMLにおいてサポートされていない。したがって、XMLベースのプロジェクトにとって以前に提供された推奨された処置に対応するものは全く用意されていない。31 XMLの実体は実際には二つの基本的な型があるだけである。パースされたものとパースされていないものである。パースされていない実体はここでは何の関連もない。あるXML文書におけるパースされた実体への参照は、ある種の挙動のみに帰結する。それらがパーサの入力ストリームに現れる時、パーサは、その実体名をその代替テキストに対応づける文書の内部あるいは外部のサブセットの中の宣言を見つけることによってそれらを解決できることを期待する。パーサはそれから、代替テキストを実体参照の代わりにその文書に挿入し、その実体参照は跡形もなく捨て去られる。置換処置は、その実体が宣言されていなかったり、その宣言がある面で不完全であったりする (その場合パーサは致命的エラーの信号を発し停止する) ために失敗する場合以外は、アプリケーションに通知されることはない。

説明上の便のために、いっそうXMLに関連するドキュメンテーションは、このガイドラインも含めて、文字実体と文字実体参照には明確に言及するが、XMLにおける文字実体は、‘型’がコンピュータ科学用語法で理解されているという意味でのはっきりした‘型’ではない。例えばある属性の型に言及する場合である。したがって、挿入されることになる代替物が実際、マークアップを含むこともありうるテキストの任意の塊というよりもむしろ、単一の文字あるいはそれに相当するものであることを、編集ソフトウェアあるいはその他のソフトウェアが検査できるような方法は全くない。文字実体とは単純に、その代替テキストがある文字価あるいはその値を表示するあるNCRとしてたまたま宣言されている一般的な実体である。このことは、そのような実体参照をユニコード対応をもたないある文字を表すために使用するつもりであるとすると、二つの重要な帰結をもつ。第一に、実体名参照はパースの初期段階で消えてしまい、宣言された実体の値に置換されることになる。その結果、パースされた文書の中で元々入力された通りに実体参照にアクセスすることを必要とする処理は全く不可能である。第二に、もしある文字実体が普通の文字に真に等しいものとして使用され、結果としてある単一の文字が正当に起こりうる文書のあらゆる場所で (ただし要素名と属性名の中は別である。そこではいかなる参照も認められない。) 用いられることになるとするならば、その時には、その代替値が実際純粋な文字データであるということは不可欠である。もしその実体の代替値が何らかのマークアップやあるいは処理の指示を含んでいるとしたならば、ある文書の中に、単一の文字データは正当であるが、マークアップや他の代替が文書を無効あるいは整形式でないものにしてしまいうるような箇所が多くあることになるであろう。まとめると、これらの考察は、XML文書の中で非ユニコード文字を表すためのCERの明白な使用が単純に可能でないことを意味している。

ユニコード文字定義の特別な側面

互換文字

ユニコードの原則は実用主義によって思慮分別をもって和らげられている。このことは、中でも、標準が符号化する実際の文字レパートリー、特にその初期の時期から始まるそれらの部分が、ユニコードコンソーシアムの理論的アプローチの厳格な解釈の上に本来抽象文字としてみなされてこなかったたくさんのものを含んでいる、ということを意味している。これらの文字のいくつかは互換文字に割り当てられたコードポイント領域に一緒に分類されている。合字は好例である。合字 (例えばラテン文字の近接する小文字‘s’と‘t’あるいは‘f’と‘i’がある。一筆一筆の間でペンをあげない筆記慣習によって生み出されたのか、タイプデザインの美学によって要求されたのか) は結合している二つの文字以上に付加された意味論的価値のない表象的素性である。(ただし古文書学者や活版印刷術の歴史家にとって、与えられたマニュスクリプトや版にそれらが存在することやその形は学術的重要性をもつこともある。) しかしながら、ユニコード標準が最初に議論されるまで、より一般的な合字を表示する単一のグリフを組版装置や高級プリンターのレパートリーに含めることは一般的な慣習となっていた。そしてたとえそれらが二つの異なる抽象文字を表示するものであっても、それらの装置に組み込まれた符号化文字集合がそのようなグリフのために単一のコードポイントを使用することもそうであった。そのような装置の製造者と使用者の間でユニコードをますます受け入れさせるために、そのような擬似文字をユニコードに編入するべきであるということが同意された。それにもかかわらず、あるプロジェクトがそのような合字形の存在を符号化する必要をもつならば、通常マークアップを通してなされるべきであって、互換文字を使用してなされるべきではない。そうして、合字の存在は、依然として適切な場所で識別されうる (そして望むならば視覚的に表現されうる) のであるが、索引生成や検索のソフトウェアはその文書の中のコードポイントを当該の二つの構成要素となる文字が単に連続して現れたものとして扱い、またそうして正しくそれらの意味を非合字の対応する物と連携させるであろう。そのような合字は、フランス語の“cœur”においてそうであるように、(普通) 二重母音を指示する際の、二重音字と混同すべきではない。二重音字は本来抽象文字を表示する極小の正書法の単位であって単純にグリフの合成であるわけではなく、索引生成や検索のソフトウェアはそれをそのようなものとして扱わなければならないのである。ある二重音字がある元テキストにある場合、適切なCERであれNCRであれ当該文字を直接的に入力することによって、それが実際表示する単一の抽象文字に対する適切なコードポイントを使用して通常符号化されるべきである。

前もって組み合わされた文字・組み合わせ文字と正規化

ユニコードの中のダイアクリティカルマークを伴う文字の扱いは、厳格さと実用主義の同様の組み合わせを示している。ラテン文字やその他の字体でダイアクリティカルマークを伴う多くの文字をコードポイント列によって表示することがもっともらしいのは充分明白である。その場合、一方のコードポイントが基本となる文字を指示し、残りが当該の抽象文字のにふさわしいグリフ表現を生み出すために基本となる文字と組み合わされる一つあるいはそれ以上のダイアクリティカルマークを表示するのである。その初期段階から、ユニコードコンソーシアムは理論上この見解を支持したが、実用面では、既に一般的に現存のエンコーディングスキーマにおいて単一の他と区別されるコードポイントを割り当てられてきた前もって組み合わされた文字に単一のコードポイントを割り当てることによって妥協するよう準備がされていた。しかしながら、このことは、かなり多くの一般に現れる抽象文字にとって、ユニコードが二つの異なってはいるが論理的・意味論的には等しいエンコーディングをもっているということを意味している。前もって組み合わされた単一のコードポイントと、基本となる文字に加えて一つ以上の組み合わせのダイアクリティックというコードポイント列である。最近ユニコードに追加された字体は、もはやこのコードポイントの重複を示すことはない (現在の慣習では、組み合わせ文字の使用が可能である場合、前もって組み合わされた新たな文字は何も定義されることはない) が、そうであるからといって、その文字集合の古層において永久的に具体化された重複によって引き起こされる問題が取り除かれるわけではない。ある東アジア文字のエンコーディングから生じる本質的に類似した問題とともに、この重複はユニコード文書の正規化を実行する必要性を提起している。正規化とは、ある与えられた抽象文字が、ある与えられたユニコード文書あるいは文書コレクションの中でのみ、単一の方法で表示されているということを保証する処理である。ユニコードコンソーシアムは四つの標準正規化形式を提供しており、そのうち、正規化形式C (NFC) がテキストエンコーディングプロジェクトにとっては最も適切であるように思われる。ワールド・ワイド・ウェブコンソーシアムは、Character Model for the World Wide Web 1.0(http://www.w3.org/TR/charmod) という文書を作ったが、それは、中でも、正規化の問題を議論しており、いくつかの関連する原則を概説している。権威ある参考文献はUnicode Standard Annex #15 Unicode Normalization Forms (http://www.unicode.org/reports/tr15/) である。個別のプロジェクトは正規化の必要性に関する自分たちの決定が、当面ハードウェアやソフトウェアが組み合わせ記号を使用して符号化された抽象文字を正しく表現することは (あるいは整合性をもって識別することさえ) 決してできないという事実によってどれほど影響されるか、ということを決定しなければならないであろう。しかしながら、上記文書で議論されたような正規化は、ハングルの組み合わせ文字に関連した問題に対する以外では、東アジア文字に関して上述した問題を扱うわけではないということは注意すべきである。

どのユニコードベースのプロジェクトも、包括的かつ首尾一貫した正規化の慣習に関して同意し、整合的に実装し、充分に記述すべきである、ということは重要である。あるプロジェクトの中でのデータの完全性を保証するのと同様に、整合的に実装され、適切に記述された正規化の方針は、うまく文書を交換するには不可欠なのである。

文字の意味

ユニバーサル文字集合自体に加えて、ユニコードコンソーシアムは付加的な文字の意味に関するデータベースを維持している。(http://www.unicode.org/ucd/) これは各々の文字コードポイントとそれに対する基準素性の名前を含んでいる。文字素性は、このデータベースで得られるように、意味と、したがってあるコードポイントあるいは文字の所期の使用法を決定する。それはまた、この文字を異なった目的で正しく処理するのに必要とされうる情報を含んである。このデータベースはどのユニコードポイントをある文字を符号化するのに使用するのかということを決定する際に重要な参考文献である。

ユニコードコンソーシアムによって入手可能となっている印刷されたドキュメンテーションとリストに加えて、それが含む情報は、ウェブ上のたくさんの検索システムによって入手することもできる。(例えばhttp://www.eki.ee/letter/) データベースに含まれている文字素性の例は、格・数値・指向性・どこで‘互換文字’として利用できる状態があるかを含んでいる。(詳細はFreytag (2006)を参照) あるプロジェクトがPUAのコードポイントでローカルな文字定義を行う場合、当該の文字に関するどんな関連する付加情報も、5 標準化されていない文字と字形の表現で詳しく議論されているのと類似の方法で記録することが望ましい。

検証されていない文書における文字実体

SGMLとXMLとの間の重要な違いは、後者が検証されていない文書の処理を許容することである。妥当性と検証とは中心的なTEIの関心事であるから、このガイドラインにしたがって用意された文書がXMLという意味で単に整形式なものとして設計されたり実装されたりしてしまうことはありそうにない。しかしながら、XML技術の領域では、ある文書があるDTDあるいはスキーマを呼び出す場合でも、XMLプロセッサがその充分な検証を行うということでは常に必ずしもない。XSLT変換は一般的な好例である。ある文書があるXSLT処理へと変換のために渡される流れ作業の段階まで、関係づけられたDTDあるいはスキーマは既にその完全性保証と質の制御の役割を果たしていそうであり、そのため処理のオーバーヘッドに検証を加えることは望ましくないかもしれない。この理由のために、ほとんどのXSLTプロセッサはデフォルトでは、たとえDTDあるいはスキーマが宣言されかつアクセスできるとしても、検証を試みることはない。しかしながら、このことはパースされた実体 (及び特に今の文脈での文字実体) が参照される場合に問題を生じうる。検証パーサがDTDからのすべての実体宣言 (文字実体の宣言も含む) を処理の最初の段階で読み込んでしまい、その結果、それらは要求されたときに解決されてしまいうるのである。しかしながら、検証が全く行われない場合、パーサがあらゆる状況でそのような実体を解決することができると自動的に仮定することはできない。XML標準は検証をしないパーサに対して、実体宣言が文書の内部サブセットの中にある場合のみそれらを読み込み実行することを要求している。(もちろんそのことが、実体宣言を処理に先立って手動でその文書インスタンスに組み込まなければならない、ということを意味するわけではない。例えば、文字実体集合は、変数実体を介してそこに置かれているならば、通常のTEIの慣習がそうであるように、内部サブセットの中にあるものとして数えられる。) 非検証モードにある時、外部サブセットにある実体宣言にアクセスするパーサもあろうが、この挙動は標準によって必須とされたものではなく、頼るべきではない。もしこれらの事実を念頭においておけば、パーサの検証が停止された時ある文書の中に文字実体があることでいかなる困難も引き起こされるということはないであろう。

ユニコード内部表示から生じる問題

理論上、符号化する人は、ユニコードコードポイントがある文書内であるいはある処理システムのメモリ上で内部的に表示されうる様々な仕方に関する知識を持つ必要はないはずであるが、経験上、この領域で問題が誤った慣習や欠陥のあるソフトウェアのために生じており、その結果の兆候を識別し、その原因を正すためには、ユニコードの内部表示のいくつかの面に関する概説的知識があることが望ましい。

UTF-8に関連したエンコーディングエラー

ユニコード3.0以降によって割り当てられたコードポイントは概念上32ビット整数であり、コンピュータストレージ上で各々そのような整数を表示する最も率直な方法は4つの8ビットバイトを使用することであろう。ラテン文字で最も一般的に使用される文字のコードポイントの多くは、1バイトだけで表示され、一般的に使用される大多数 (最も頻繁に使用されるPUA領域から割り当てられたものも含む) は2バイトのみで表現されうる。これがUTF-8とUTF-16との使用とXML標準におけるその特別な地位の理由となる。UTF-8とUTF-16は32ビットコードポイントを経済的に表示する方法なのである。

UTF-8は可変長エンコーディングである。基礎となるコードポイントの中で重要なビットが多いほど (あるいは日常的用語法では文字を表示するために使用される数が大きいほど)、UTF-8は多くのバイトをそれを符号化するために使用する。UTF-8をXML文書のデフォルトエンコーディングとしてラテン文字を表示し、その状態を説明するために特に魅力的にしているものは、7ビット以下で表現できるすべてのコードポイント (元のASCII文字集合にある127の値) もUTF-8では同じ7ビット以下のビットとして (したがって単一バイトで) 表現されることである。そういうわけで、実際には純粋な7ビットASCIIで符合化されている文書を改変なく、またそのエンコーディングを明示的に宣言することなく、XMLプロセッサに送ることができるのである。プロセッサはそれをユニコードのUTF-8表示のものであるとみなし、かつそれを根拠に正しくそれを扱うことができるのである。

しかしながら、ラテンベースの字体の範囲の中でも、ASCIIに対する8ビット拡張からの文字を使用する文書をもつプロジェクトもある。例えば、ISO-8859-nエンコーディングシリーズである。ISO-8859-nのもとで8ビットすべてを使用する文字がUTF-8で符号化される仕方は著しく異なっており、困惑させるようなエラーを提起する。最上位ビットがセットされる単一バイトコードポイントをもつ抽象文字 (つまり、129~255の十進法表示をもつ) はISO-8859-nではコードポイントと同じ値で単一バイトとして符号化される。しかしUTF-8では、その範囲内のコードポイントの値は2バイトの列として表現される。つまり、当該の抽象文字は、ファイルあるいはメモリーの中で、もはやそのコードポイントの値と同じ数で表示されることはないのである。それは二つの異なった数の列へと変換され (transformed)る。 (したがってUTFのTである。) 今や、そのようなUTF-8列が基礎となるコードポイントの値に由来する仕方の副作用として、ISO-8859-nエンコーディングで用いられる単一バイトの8ビットの値の多くがUTF-8では不正なものなのである。

この複雑な状況は単純な帰結として大きな当惑をもたらしうる。XMLプロセッサはパーサに対して宣言することが必要なそのエンコーディングがないと、7ビットASCIIとして文字データを易々と扱い、同様に、ISO文字集合の厳密なASCIIサブセット外の文字をたまたま使用していないならば、宣言されていないISO-8859-nエンコーディングで符号化された文書を受け入れてしまうであろう。しかし、文書のエンコーディングが明示的にかつ正しく宣言されていない限り、入力ストリームにおいてISO-8859-n集合からの8ビット文字に出会った時、パースは直ちに失敗してしまうであろう。明示的にエンコーディングを宣言することが問題を解決するはずであるが、そのファイルが一貫して正しく符号化されていれば、そうするであろう。しかし、テキストエディタとワードプロセッサは現在もっているユニコードサポートの程度も割合も異なっているから、プロジェクトがUTF-8で符号化されたファイルを例えばISO-8859-1の他のものと一緒に扱わなければならないということに気づきそうである。そのようなエンコーディングの違いは、特に内部エンコーディングが区別できる文字の割合が比較的小さいならば (例えば長い英語のテキストで少量のフランス語の単語をともなう場合) 気づかれないままになるかもしれない。もし文書を準備する過程でそのような二つのファイルが組み込まれたり、‘切り貼り’手法を介して混合されたりしたならば、結果としてのファイルの内部エンコーディングが同様に混ざったものとなっている可能性があまりに高い。場違いの‘使い勝手’の概念のおかげで、現在の編集ソフトウェアの中にはテキストを表示する時に黙ってそのような誤った符号化を訂正してしまうものもあり、その結果、XMLパーサが致命的な‘無効な文字’のエラーを出して終了するまでその誤った符合化が隠れたままになってしまうのである。

誤って混合されたエンコーディングがそのようなエラーの元となる場合、エンコーディング宣言を変えても、そうすることがその問題をわかりにくくするかもしれないけれども、問題を解決することはない。UTF-8として宣言されたあるファイルの中の8ビットの文字コードが常にパーサを止めてしまうであろう。さらに油断のならないことに、ISO-8859-1として宣言されたあるファイルの中のUTF-8列はパースを止めてしまうことはなく、データの損傷を引き起こしてしまう。パーサはすべてのUTF-8列の各々のバイトを黙って、しかし誤って、偽りの別々の文字に変換してしまう。そのことが意味論的なエラーを引き起こしても、一連の処理の中のずっと後になるまで一見して明らかなものとはならないこともある。

非ラテン文字の文書を日常的に扱うプロジェクトにおいては、すべての人が正確で整合性をもったエンコーディングを確実にする必要があることに充分気づいている。混合エンコーディングの問題がめったに起こらないような場所や、容易にその問題を識別し、対処するような場合には、そうである。しかしながら、本当の混乱は、その問題への意識が低いプロジェクトにおいて起こりがちである。なぜならば、そうしたプロジェクトは主としてアクセントのないラテン文字を用い、アクセント付きの文字あるいはその他の‘特殊な文字’、つまりISO-8859-nとUTF-8での内部的な表示が異なっているもの (たとえばコピーライト記号や、最終的なHTML出力が思い描かれる際にしばしばトラブルメーカーとなる‘ノーブレークスペース (non-breaking space)’)、はまばらにあるだけである。そのようなプロジェクトが自らを英語文書のみに関わるものと見なしていても、あるいは特にそう見なしている場合には、XMLとユニコードの近接した関係は、そのプロジェクトがこれらのエンコーディングの問題を理解し、コード変換と検証のために適切なソフトウェアを使用することを含む、エンコーディングとその正しい宣言との整合性と完全性を保証する手続きを開発することが必要であるということを意味している。

UTF-16に関連したエンコーディングエラー

以上で概説したユニコードコードポイントの内部表示としてのUTF-8の利点は、文書がラテン文字・キリル文字・ヘブライ文字以外の字体である場合には通用しない。16ビットの領域 (2バイト) のコードポイントをもつ文字が主な場合、UTF-8は適切ではない。各々の抽象文字を表示するには三つ以上のバイトが必要であるからである。この場合、より好ましいユニコード表示 (ただしすべてのXML準拠パーサがサポートしていなければならない) はUTF-16である。その場合、抽象文字に対応する各々のコードポイントは二つの8ビットバイト32で表示される。このエンコーディングは別の危険をもたらす。編集ソフトウェアのユニコードサポートが比較的均質ではなく未成熟である場合は特にである。そのコードポイントは (ほとんどの大衆的なコンピュータで) 二つの別々のバイトに保存された16ビット整数として表示されるから、それらのバイトが保存される順序が重要となる。これは基礎となるハードウェアに依存する。卓上のコンピュータ利用の範囲では、例えば非インテルのマッキントッシュの機械は (メモリ上でと同様ディスク上でも) 16ビット整数を高位バイトを最初にして表示するバイトの組を保存するが、PCともっと最近のマッキントッシュのインテルプロセッサを使用するシステムは逆順でバイトを保存する。(このことはしばしばスウィフトの命名によるビッグエンディアンリトルエンディアンバイト順として言及される。) このことは、UTF-16で符号化された意味上同一のプレーンテキストファイルがマッキントッシュとPCで準備され、その二つのファイルがディスクに保存される場合、一方のファイルの各々のバイトの組がもう一方のファイルの対応するバイトの組と逆の順序になっているであろう、ということを意味している。その明らかな非互換問題を避けるために、XML標準は、宣言されたエンコーディングがUTF-16であるすべての文書に、それ自体は文書の一部ではなく、単に後続する文書のバイト順をプロセッサが決定するためのバイト順マーカー (BOM) である特別な擬似文字を伴うことを要求している。正しいBOMが挿入され、そのファイルを通して一貫してバイト順が維持されることは、ソフトウェアが透過的に注意するべきであるが、経験上、ビッグエンディアンとリトルエンディアンのハードウェアをまたいで作業が配布される環境では特に、現在のソフトウェア開発の状態では必ずしも当然のものと考えることはできない。UTF-8を含む混合エンコーディングの問題と同様、UTF-16のファイルの一貫性をもたないバイト順は、バイト順の完全性を正しく強制しないソフトウェアを使用してファイル間で組み込んだり切り貼りしたりした結果であるように思われる。そのこともバイト順の一貫性を使用者から隠してしまう見当違いの‘使い勝手’によるものである。今一度繰り返せば、その結果が、あるエディタでは正しく見えるが、XMLパーサがすぐさま拒絶したり、あるいは黙ってひどく歪曲された形で通してしまうファイルである。さらに、それに続くエラーを避けるためには、関連するエンコーディングの問題に関する見識のある自覚を啓発し、最初にそれらを避け、早期の段階で検知する方策を考案する必要があるのである。

Contents « v XML入門 » 1 TEIの基礎構造

注釈
27.
Best Current Practice 47は現在二つの別々の勧告からなる。Phillips and Davis (eds.) (2006)とそれに付随する勧告Phillips and Davis (eds.) (2006)である。時を越えて、他のIETF文書が、最良の現在の慣習として、RFC 4646とRFC 4647を継承するかもしれない。W3C国際化活動は、BCP 47への便利な入門Language tags in HTML and XMLを公開した。
28.
現在これは、att.lexicographicクラスの属性expandnormsplitvalue、及び origのみを含んでいる。
29.
ユニコードだけがここで明示的に言及されているけれども、文字レパートリーと割り当てられたユニコードのコードポイントとISO標準10646とが同一であり、このことが持続する仕方で維持されていることは注意すべきである。
30.
ワールド・ワイド・ウェブコンソーシアムは二つの標準スタイルシート言語に対する勧告を提供している。CSSあるいはXSLのいずれかをこの目的のために使用することができる。
31.
本質的に、SGMLパーサはSDATA型の実体への参照に出会った時、サービスをしているアプリケーションに対して、その文書で見つけた通りにその実体の名前を、ローカルなシステム上のどこかある位置へのポインタを加えて与える。次にその位置にあるものがアプリケーションに許容したり指示することで、アプリケーションがテーブルの中の実体名を探し出したり、参照された実体に関する情報を引き出したりすることを含むたくさんのことがらの一つを行う。そのことが、その抽象文字の処理にふさわしいアプリケーションの中で、特定の振る舞いの引き金となりうるのである。しかしながら、XMLパーサに実体参照に反応してその類のことをさせる方法はない。
32.
16ビット領域以上のコードポイントを表示するために‘サロゲート’値を使用することはここでは除外する。それは問題の要点に影響しない複雑さを加えるからである。


Copyright TEIコンソーシアム 2007 Licensed under the GPL. Copying and redistribution is permitted and encouraged.
Version 1.0.