2002年09月18日の日記です


Unicode  2002-09-18 23:35:34  コンピュータ

もうずいぶん前のことだが、PHP にマルチバイト正規表現関数が正式サポートされた。


以前は日本人が作っていて jstr_〜 (Japanese STRings の略だ)という名称だったが、国際化対応されて mb_〜 (Multi Byte の略だ)に変更になった。



それまでは JIS/SJIS/EUC/UTF-8 しか対応していなかったのだが、対応するコードも非常に増えている。


以前に仕事で作ったプログラムでは、UCS-2 が欲しかったのだが、無かったので PHP のプログラムで生成していた。

今回、正式に UCS-2 にも対応したので、プログラムを書き直すことにした。


ちなみに、Unicode というのはどんな文字も 16bit であらわす。(とは限らないのだが、話をわかりやすくするためにそういうことにしておく)

UCS-2 というのは、1文字が 2byte であらわされた、素の Unicode だ。


UTF-8 というのは、「アルファベットが 16bit なんて無駄だ」というわがままなアメリカ人のための規格だ。

従来の ASCII 文字は 1byte であらわせるが、ヨーロッパ言語圏の文字は 2byte 、漢字言語圏は 3byte であらわすようにしてある。ただし、元のコード自体は Unicode と同じ。 JIS と EUC の関係みたいなものだ。



以前の jstr では、EUC から Unicode に変換する時に、ちょっと困ったことがおきていた。

JIS/SJIS/EUC というのは「同じコードの表現方法が違うだけ」なので数式で変換できるのだが、Unicode はコード体系がまったく違う。そのため、変換表を用意する必要がある。


jstr では、このコード表がいわゆる「MS-Unicode」なのだ。一般的な Unicode ではなく、マイクロソフト独自のもの。


#MS を弁護しておくと、Unicode は「コードと文字の形」だけを定義して、「従来のコードとの対応」は定義しなかった。そのため、ベンダーごとに微妙な違いがあったりするが、それでは不便なのでまとめられつつある。


仕事で使いたかったのは、「一般的な」 Unicode だったので、これには困った。JIS のなかで、5文字が正しく変換できないので、その5文字だけ特別扱いしていた。


すばらしいことに、mb ではこの問題が解消していた。JIS から Unicode への変換では正しく変換を行い、Unicode から JIS への変換では、MS-Unicode でも一般的な Unicode でも正しく変換する。


これで面倒な問題がひとつ減った。



もうひとつ、変換したいコードには「外字領域」を含んでいたのだが、これは正しく変換できない。そもそも正式な Unicode でも、正式な JIS でも無いからだ。


そこでこれらは Unicode 変換の前後に個別対応するのだが、mb_ereg_replace では「文字コードの範囲」に対応している上、「置換後文字列の動的生成」に対応しているので、命令一発で処理できる。


しかし、なぜか UCS-2 の状態での正規表現検索は出来ない。

UCS-2 では、「1バイト目」と「2バイト目」を区別する方法が無いからだろう…とも思うのだが、そもそも全文字 16bit で表現されるので、区別の必要すらないはず。


まぁ、出来ないのは仕方が無いので、ここは UTF-8 に変換してから置換を行う。UTF-8 には対応している。

UTF-8 で、「文字の範囲」を指定する。ややこしい3バイトコードを正しく処理する。すばらしい。


しかし、なぜかその領域内に、2文字だけ処理できない文字がある。何故そうなるのかはわからないが、バグだろう。あんまりすばらしくない。


これは、mb_ereg_replace した後で、普通の文字列用の preg_replace で個別処理。




以前は、UTF-8 から UCS-2 の変換を、1バイトずつ PHP で処理して変換していた。

PHP はインタプリタみたいなもの(厳密には違うが)で遅いのだが、その処理が命令一発になったので非常に高速になった。


細かなバグはいっぱいあって、個別処理を入れないといけない面倒くささはあるが、以前よりもプログラムがすっきりして速度も上がったのだから、まぁよしとしよう。



同じテーマの日記(最近の一覧)

コンピュータ

別年同日の日記

13年 ICANN設立日(1998)

14年 HARLIE とコンピューターウィルス

18年 夏の家族旅行


申し訳ありませんが、現在意見投稿をできない状態にしています


戻る
トップページへ

-- share --

0000

-- follow --




- Reverse Link -