PHPの次回リリースに向けたUnicodeのサポート作業

Andrei Zmievski氏は、PHPプログラミング言語のメイン開発者の1人である。2005年3月以降、同氏は約20名の開発者たちと共にPHPのバージョン6.0におけるUnicodeサポートの実現を目指して開発活動を続けてきたが、その努力は現在、至近に迫ったアルファ版のリリースという形で結実しつつある。

Unicodeとは、この世に存在するすべての文字をコンピュータ用キャラクタにマッピングすることを究極的な目的としたプロジェクトである。2006年秋にリリースされたUnicodeバージョン5.0段階での登録キャラクタ数は10万近くに達しているが、キャパシティとしては100万前後まで収容可能とされている。こうしたUnicodeをサポートする側のソフトウェア数も順調に増え続けており、その際のフォーマットとしてはUnicode Transformation Formats(UTF)に定められた、UTF-8、UTF-16、UTF-32のいずれかを用いるのが一般的である。

こうしたソフトウェアにおけるUnicodeの実装時に重要となるのが、Common Locale Data Repository(CLDR)のサポートである。このCLDRというコンセプトは、Zmievski氏の説明にもあるように、GNU/LinuxなどのPOSIX系システムで従来用いられてきたロケールに比べて大きく異なった存在になっている。このCLDRとは、単にキャラクタのセット群を規定するだけではなく、日付や通貨といった個々の言語や文字文化ごとに異なるフォーマットの使い分けにも対応しており、そうした中でもプログラマにとって特に関係するのは、文字データの照合や並べ替えに関する規則であろう。例えばウムラウト記号の付けられたキャラクタの並び順は、ドイツ語の場合は対応する通常キャラクタの直後に来るのに対して、スウェーデン語の場合は全アルファベット群の最後に置かれるという違いがある。

そしてZmievski氏が強調しているのは、こうした言語特有の情報は決して不変な存在ではなく、時代の移り変わりと共に進化しうる点である。例えば多くのヨーロッパ系ロケールで用いられている通貨記号のユーロなどは、ごく最近に追加されたものでしかない。また一口にスペイン語といっても、現代語と古語とでは文字の並べ替え規則が異なっている。こうしたロケールの対応状況だが、現状のCLDRでは121の言語に対して360のロケールが登録されている。

PHPの場合に問題となる点としてZmievski氏は、「多言語データのエンコードおよび処理について、コア言語が未対応ないしはごく一部しか対応していません。また現行バージョンのPHPにおけるiocnvmbstringなどの機能拡張は、POSIXロケールに100%依存しています」と説明している。実のところ現行バージョンでもUnicodeのサポートは可能ではあるのだが、「そのためには多数の障壁を越える必要があります」というのがZmievski氏による結論だ。

もっとも、主として現在のコンピュータ言語のベースとなっているのは英語という言語であり、幸運にも英語に精通しているプログラマであれば、Unicodeを使用できるか否かを特に記にする必要はないということにもなる。「常々気になっていたのですが、私がこの種の話をアメリカの国外で講演をする場合、会場はたいてい満員になります」とZmievski氏は語る。「アメリカ国内で講演を行う場合の来場者は、せいぜいが10数人といったところですけどね」

しかしながら世界的なインターネットの普及に伴って、非アルファベット系の文字を用いたドメイン名への対応が求められるようになっており、そうした状況を受ける形でZmievski氏が主張しているのが、PHPにおいても他のプログラミング言語と同様に「状況の変化に対応する必要があるはずです。自分たちが気づいていないだけで、そうした需要は確実に存在しているのですから」ということだ。

PHPに加えられる変更点

Zmievski氏によると、PHP 6.0においてUnicodeをサポートする際には、International Components for Unicode(ICU)の多くを選択的に取り込むことになるとのことだ。これらのコンポーネントを採用することで、異なるロケールおよびキャラクタセット間の変換、文字の並べ替え、別表記への変換、Unicode用のテキスト処理、Unicode用の正規表現など、各種の処理を行うための規則を取り込めるはずである。ただし実際にこうした機能を使用するには、Unicode.semanticsコードスイッチが利用可能になるのを待たなければならない。

PHP 6.0ではこうした変化に対応して、扱う文字列のタイプも変更される。これまでは汎用の文字列タイプが1種類使われているだけであったが、変更後は、Unicode用の文字列タイプ(UTF-16で実装されるテキストデータ)およびバイナリタイプ(レガシー化したロケール用のテキストデータおよびバイナリデータの本体)という2種類を扱うことになる。おそらく、こうした文字列の取り扱いに関して最も目に付くであろう最大の変更点は、バイナリ文字列を構成する個々のキャラクタは1バイト長のデータであるのに対して、Unicode文字列の場合は、使用する言語およびエンコード方式に応じて、1キャラクタのサイズが複数バイト長のデータとなりうることであろう。その他にも、Unicode文字列におけるキャラクタへの参照は、コードポイント(Unicodeの文字コード番号)だけでなく名称によっても行えるという違いがある。

PHPプログラムを実行すると、ランタイムエンコーディングによって使用するべきエンコードが特定される。スクリプトに対するエンコード方式は、先頭行のdeclare ()ステートメントないしはINI設定によって指定されるが、これはXMLファイルと似た形式になると考えればいいだろう。ただしこうしたエンコード設定は、その後スクリプト中のpragma指定によって変更されることもある。また標準出力およびファイル/ディレクトリ名に対するエンコード方式や、タイプの異なる文字列間の変換方法を指定することも可能だ。なお、レガシー系キャラクタセット側がUnicodeキャラクタのすべてをサポートすることはできないので、そうした変換時のエラーをどう処理するか、および、PHPによるエラーレポートのフォーマットについてはプログラマによる指定が行える。

問題はUnicodeのサポートによって機能的に何が変わるかだが、それは単にUnicodeキャラクタを用いた識別子をコード中で使えるようになるというレベルに止まらず、実に様々な新機能が追加されるはずなのだ。例えばプログラマは、ロケールの指定に応じて文字データをどのような並び順で扱うかを指定したり、アクセント記号の有無や大文字表記か小文字表記かの違いに応じて処理法を変えられるようになる。より便利な機能は、異なるロケールに対するテキスト変換が行えるようになることで、具体的には、ギリシア文字の表示を英語のアルファベットに変換させるといった操作である。また日本語の場合は、全角文字と半角文字をその場で切り換えることも可能になる。

Zmievski氏が注意を喚起しているのは、Unicodeのサポートによって既存のいくつかのPHP機能が旧式化するであろうということだ。例えば文字列関数のset locale ()などはサポートが停止される可能性がある。Zmievski氏は「いくつかの.iniオプションや関数」が追加されることを予想しているが、その一方で「いずれの変更も透過的に行われるので、それによる影響は特に意識せずに済むはずです」と説明している。

Unicodeサポートに向けた開発作業の現状

対応状況に関するZmievski氏の説明によると、Unicodeの基本機能に関しては大部分が終了しているとのことだ。そしてPHPのUnicodeチームは現在、アップグレードを必要とする関数の特定を進めているところだそうである。2月12日時点の推定値として、3,047ある拡張関数の61%に相当する1,844個は既にUnicodeサポートに対応済みだとされている。同氏の希望的観測としては、アルファ版のリリースが2007年の第1四半期の末、PHP 6のファイナルバージョンは年末になるだろうとのことだ。

こうした既存の関数群に対するアップグレード作業だけが、Unicodeチームの処理すべき課題ではない。「まず最初にドキュメント類に対する変更を施す必要があります」とZmievski氏は語り、「関数の挙動だけでなく各種の機能も変更を受けますから、そうした点をドキュメントにまとめなければなりませんし、Unicodeと初めて遭遇するユーザもいるはずですから“Unicodeとは何であり、利用するには何が必要で、どのように使用するのか”という入門的な解説を付け加える必要もあるでしょう」と説明している。

その一方で同氏は、「最大の問題は、PHP 5を前提として記述されたスクリプト群をPHP 6で問題なく動作させるようにする方法を確立することです」と補足している。

こうした開発作業と負けず劣らず重要なのは、活用するための知識を解説するための作業だとZmievski氏は見ている。Unicodeの需要が高まりつつあることを明確に意識している人間は、PHPコミュニティにおいては少数派であり、PHP 6の開発者用ビルドに対する関心が低いのも、そうした事情が存在すると言うのだ。同氏がこうした状況の例えに用いているのが、地震対策についての意識と実践である。「私はサンフランシスコに住んでいますが、そこでは誰もが地震対策用の防災キットを常備しておくべき必要性を承知しています。しかし実際に何人が購入して、怠ることなく消耗品を補充し続けているでしょうか?」それと同様に、PHPコミュニティの人々も変化の到来は承知しているものの、具体的な準備を進めているようには感じられない、というのがZmievski氏の懸念するところなのだ。

Zmievski氏はコンファレンスの席上など、機会あるごとにUnicodeサポートの進捗状況やその必要性を解説するようにしており、プログラマたちに対しては、Unicodeサポートチームによる既存の開発成果を試用してみるよう呼びかけている。「私が講演を行うのは、それが目的なのです」と同氏は語る。「そもそも、そうした活動が進められているということを知らなければ、誰も使い始めようとはしないものですからね」

Bruce Byfieldは、コンピュータジャーナリストとして活躍しており、NewsForge、Linux.com、IT Manager’s Journalに定期的に寄稿している。

NewsForge.com 原文