Unicodeをさまよう幽霊文字 — 存在しない漢字が規格に残った顛末
Unicodeをさまよう幽霊文字 — 存在しない漢字が規格に残った顛末
どの辞典にもなく、誰も読み方を知らない漢字十二字が、今日も世界中すべてのコンピュータの文字表の中に生きている。これは消せばよいだけの単なる誤字なのか、それともあらゆる規格が背負わざるをえない後方互換性の宿命なのか。
導入
いま君が使っているコンピュータの文字表のどこかには、彁という漢字が入っている。この字はUnicodeのコードポイントU+5F41として正式に登録され、日本語入力で変換すれば候補に現れ、Webページにも問題なく表示される。ただ一つ問題がある。誰もこの字が何を意味するのか、どう読むのかを知らないのだ。どの漢和辞典にもこの字の見出しはない。そもそもこの字を実際に用いた文献がこの世に存在しない。それでもこの字は半世紀近くにわたり国家規格と国際規格に正式登録されたまま、我々が毎日使うOSとフォントの中で静かに一席を占め続けている。
ポール・オリアリー・マッキャン(Paul O’Leary McCann)は、自身のブログに記した「A spectre is haunting Unicode(幽霊がUnicodeを徘徊する)」という文章の中で、こうした字を指す日本語の表現を紹介している。幽霊文字。実体がないのに規格の文字表をさまよう、文字どおり幽霊のような漢字たちである。これらの字は悪意あるハッカーが仕込んだものでも、最新ソフトウェアのバグでもない。1978年に制定された日本語文字コード規格を作る過程で起きた数件の単純な過ちが、規格という器に収まった瞬間に永久に剥製化された結果である。この小さな出来事は、文字符号化の歴史と規格の慣性についての、思いのほか深い物語へとつながっていく。
幽霊文字とは何か — 規格に載った正体不明の漢字
幽霊文字とは、日本の文字コード規格であるJIS基本漢字集合に含まれていながら、典拠不明の漢字を総称する言葉である。ここで背景の説明が必要だ。JIS(日本工業規格)は、Unicodeが広く普及する以前、日本語の文字をコンピュータで扱うために作られた国家規格の文字集合である。その始まりが1978年制定のJIS C 6226(後にJIS X 0208へと改称される)だ。この規格は、日本語を書くのに必要な数千字の漢字をコード番号と対応づけて整理した巨大な表であった。
問題は日本の漢字使用のあり方にある。日本の地名と人名には、一般の漢和辞典に載らない稀少で特異な字が実に多い。ある田舎の一集落、ある家の一姓を正確に表記しようとしても、規格にその字がなければコンピュータでは処理できない。そこで規格を作る者たちは、全国の地名・行政区画を網羅した膨大な資料を漁り、実在する漢字を可能なかぎりかき集めた。その代表的な典拠が『国土行政区画総覧』である。7巻それぞれが900ページ前後に及ぶこの資料は、ページ参照なしに個々の字を検証するのが事実上不可能なほど膨大であった。ほかにも『標準コード用漢字表』(1971年)、『行政情報処理用基本漢字』(1975年)、そして今や現物が残っていない『日本生命収容人名漢字』(1973年)といった資料が参照された。
こうして数千字を手で書き写す過程に誤りが忍び込んだ。存在しない字が規格に載ってしまったのである。マッキャンが紹介する最も有名な例が妛という字だ。この字の由来はこうである。滋賀県多賀町に𡚴原(あけんばら)という地名があり、そこに使われた𡚴は山の下に女を置いた合字であった。ところがこの字が活字になかった。そこで資料の版下を組む際、山と女を別々に印刷して切り貼りし、複写した。問題はその先である。切り貼りした二つの紙片が接する境界線、すなわち重ね目の影のような印刷跡が複写では一本の画のように見え、書き写した者がこれを本物の横画と見誤ってそのまま転記したのだ。こうして本来なかった画が一本増えた妛という字が生まれた。紙片の影が漢字の画に化けたわけである。
1997年、JIS X 0208の改正作業が進むなかで、この正体不明の字たちが一体どこから来たのかを追跡する調査が始まった。改正原案作成委員会において、委員長の芝野耕司と研究者の笹原宏之が中心となり、1978年の原案を作った際に参照した文献を一つずつたどっていった。その成果は改正規格の附属書7「区点位置詳説」にまとめられた。笹原は妛の由来を突き止め、その成果は1998年に発表された。調査の末、元の典拠を持たないまま残った字は十二字であった。墸、壥、妛、彁、挧、暃、椦、槞、蟐、袮、閠、駲。ところがこのうち十一字は、古い字書に偶然同じ形が見つかる暗合の例があった。つまり誤って作られたとしても、たまたま実在した字と形が重なったのである。ただ彁の一字だけが、どの古い字書にも同形を見いだせない、マッキャンの言葉どおり「明確な典拠も歴史的先例もない」本物の幽霊であった。有力な説明は彊のような字を書き誤った結果だというものだが、その具体的な経緯はついに明らかにならなかった。
なぜ誤りを消せないのか — 後方互換性という牢獄
正体が判明したのなら、消してしまえばよいのではないか。規格からこの十二字を削除すれば、すっきりするではないか。しかしまさにこの点で、規格の慣性という冷酷な論理が働く。結論から言えば、消せないのである。
第一の理由は、UnicodeがJISをそのまま継承したという事実だ。1993年に登場したUnicode 1.1の時点で、すでにJIS基本漢字がまるごとUnicodeに収録されていた。Unicodeは当初から各国の既存文字規格を統合することを目標に掲げ、その過程で最も重視した原則の一つが往復変換の互換性(round-trip compatibility)であった。すなわち、JISで符号化されたテキストをUnicodeに変換し、再びJISに戻したとき、元と一字も違わず復元されねばならないという要求である。この無損失の往復を保証するには、JISに存在するすべてのコード位置がUnicode側にも一対一で対応する席を持たねばならない。その字が実在しようが幽霊だろうが関係ない。規格にコード番号が与えられた以上、それは変換の鎖全体で保存されるべき一項目である。幽霊文字は、この無損失の契約に無賃乗車してUnicodeへ渡ってきたのだ。
第二の理由は、Unicode自身の安定性ポリシー(stability policy)である。Unicodeコンソーシアムは、いったん与えたコードポイントは決して回収せず、別の字へ再割り当てもしないという規則を明文化している。理由は明白だ。世の中にはすでにこのコードポイントで保存された文書・データベース・ファイルが無数に存在する。もしU+5F41が昨日まで彁を指していたのが今日別の字に変わったら、過去に保存されたすべてのデータが静かに汚染される。一つの誤りを消す代償に、数十年分のデータの整合性を壊すことになる。だからUnicodeは誤りすら消さない道を選んだ。ひとたび辞典に誤って印刷された誤植が、その辞典が世界の標準となった瞬間、皆が永遠に再現せねばならない規範として固まってしまったのと同じである。
ここでさらに根本的な事実を一つ押さえておかねばならない。誤りを消せないのはUnicodeだけでなく、日本自身の規格も同じであったという点だ。1997年の調査で幽霊文字の正体がかなりの部分まで明らかになったにもかかわらず、JIS X 0208の改正版はこの十二字を規格から外す代わりに、附属書にその顛末を記録する道を選んだ。すでにこのコード位置を使うワープロ・専用機・データが日本全国に行き渡っていたからである。規格を直す側が規格に従う側より常に遅れるという、広く採用された規格の根本的な非対称がここに現れる。しかもJISとUnicodeを結ぶ変換表そのものが一つの永久遺産となる。二つの規格を行き来する対応づけがひとたび固定されれば、その対応づけを使うすべてのソフトウェアが特定のコード位置の存在を前提とし、そのうち一つを外しただけで連鎖的に対応関係が狂う。幽霊文字を消すことは、字を一つ消すことではなく、その字を前提に組まれた巨大な対応網全体を揺るがすことになるのだ。
HN(Hacker News)の議論では、この件がUnicodeのより大きな論争、すなわちCJK統合漢字(Han unification)につながるという指摘が出た。Unicodeは16ビット空間の制約と実用的な判断のもと、中国・日本・韓国で形の似た漢字を一つのコードポイントに統合したが、そのために見かけ上同じ字がフォント次第で、つまり中国語用フォントか日本語用フォントかによって異なって描かれる問題が生じる、というものである。統合に賛成する側はこの作業が言語学者と文献学者からなる尊敬すべき専門家集団の慎重な成果だと擁護し、反対する側は統合された字と統合されなかった字が入り混じってテキスト検索や言語処理に実質的な混乱をもたらすと批判した、という趣旨の議論が交わされた。また、いったんコードポイントが与えられれば誤りでも取り消せないというこの永続性の原則そのものが、レガシーデータの安全を守ると同時に過ちを化石のように剥製化するという両面性が、繰り返し指摘されていた。幽霊文字はまさにこの両面性の最も純粋な標本なのである。無損失の互換性という美徳と、誤りの永久保存という副作用は同じ硬貨の裏表であり、どちらか一方だけを取る方法はない。
幽霊と共に生きる法 — エンジニアへの教訓
幽霊文字の話は面白いトリビアで終わらない。ここには規格を扱うすべてのエンジニアに通じる構造的な教訓がある。核心はこうだ。広く採用される規格は、事実上追加のみ可能な(append-only)システムであるということ。ひとたび入った項目は、正しかろうが誤っていようが永遠に残る。だとすれば、誤りを捕まえられる唯一の安価な地点は、項目が規格に入る直前、入口だけである。入口を通った誤りを後から取り除く費用は、事実上無限大に発散する。幽霊文字を作ったのは、きわめて精巧な攻撃ではなく、切り貼りした紙片の影を画と取り違えた素朴な転記ミスであった。そしてまさにその素朴なミスが、検証もなく規格に流れ込んだ瞬間、半世紀を生き延びたのだ。
楽観的に見れば、幽霊文字が今日およぼす実質的な害はほとんどない。コードポイントをいくつか占め、フォントにグリフをいくつか要求する程度であり、Unicodeの広大なコード空間においてこの程度は丸め誤差にも満たない。むしろこれらの字は思いがけない第二の生を得ることもあった。何の意味も割り当てられていない白紙のような存在であるがゆえに、本物の幽霊である彁は、リズムゲームのbeatmania IIDXや太鼓の達人といった作品で正体不明・超自然の雰囲気を出す素材として実際に使われた。誤りが創作の材料として再利用されたのである。
悲観的に見れば、これは規模の大きくなったあらゆる規格が背負う負債の縮図である。Unicodeには幽霊文字のほかにも、CJK統合の過程で生まれた別の幽霊たち、廃止(deprecated)されても削除はできないコードポイント、互換性のためだけに存在する重複文字が幾重にも積み重なっている。絵文字の結合規則のように新たに追加される複雑さも、結局は同じ原理の上に乗る。現実的な結論はその中間にある。規格の誤りは消すものではなく抱えていくものであり、だからこそ何を規格に入れるかを決める最初の瞬間に、最大の検証を集中させねばならない。削除が不可能なシステムで品質を守る方法は、事後の訂正ではなく事前の統制だけである。
結論
では最初の問いに戻ろう。幽霊文字は消せばよいだけの誤字なのか、それとも規格の宿命なのか。答えはどちらもである。その起源は、紙片の影を画と見誤った、呆れるほど些細な誤字であった。しかしその誤字が国家規格を経て国際規格へと継承され、無損失の互換性と永続性の原則という二重の契約で封印された瞬間、それはもはや消せる誤りではなく、システムの一部となった。誤りの永久保存は欠陥ではなく、過去のデータを守るためにUnicodeが意識して払う代償なのである。
彁はこれからも消されないだろう。我々はこの幽霊たちとこれからも共に生き、その大半は存在すら知らないまま通り過ぎていくだろう。次に君が何かの規格の仕様書に新しい項目を一つ追加しようとするとき、しばしこの十二字を思い浮かべてみてはどうか。いま何気なく入れるこの一行が、半世紀後、誰かのコンピュータの中で誰も意味を知らない幽霊としてさまようことになるかもしれない。規格に何かを入れるということは、それを永遠に引き受けるということなのだ。
出典: