[PHP-dev 27] Re: ZendのSJIS対応パッチを作ってみました

Hiro Yoshioka php-dev@php.gr.jp
Wed, 04 Jul 2001 11:31:51 +0900


よしおかです。

> ふじもとです。

こんにちは

> > デフォルトの状態でのパフォーマンスを落とすようだと採用されないかもしれな
> > いですが、SJIS以外の動作に影響がほとんどないようでしたら受け入れられやす
> > いと思います。
> 
> うーん、これに関してはいろいろ考えていたのですが結構むずかしいです。Zend
> Engineバージョン1.06(最新は1.07ですね)のみに対応するのでしたら力技でなん
> とかなるのですが、これをやると状態遷移がちょこっと変わると、SJISパッチも
> 一から書き直し、ということになりかねませんので...
> また、エンコーディング自動検出部分に関してはどうしてもパフォーマンスに影
> 響せざるを得ないですし。
> 
> となると、HAVE_MBSTRINGかMBSTR_ENC_TRANS(もしくは新たなオプション)を見て
> コンパイル時に決めるしかないでしょうか?

パッチを拝見しました。

自動検出にこだわらなければ
zend_scan_charset()
で陽にencodingをゲットする仕様にしてみたらいかがでしょう。

すなわち、php スクリプトの先頭にキーワードをつけて
たとえば、
script_encoding=hogehoge;
と書いてあれば、hogehoge エンコーディングだと決定すると。
(script_encoding='hogehoge';とすべきかどうか?)

これをパースするコストは非常に低いと思います。

> 一応これに関しては暇をみてベンチマークしてみます。
> 
> なにはともあれ、パッチを投げるにしても
> 
> - 十分なテスト
> - ベンチマーク
> - ZTS対応
> - CXXでのコンパイル対応(zend_language_scanner_cc.ccの変更)
> - エンコーディング自動検出部分の改良

ソースコードのピアレビュー

> が必須です。特にエンコーディング自動検出部分はLATIN1等での動作が怪しいの
> でmbstringのソース等を参考にして速く正確になるように改良する予定です。8
> 月中くらいにできるとよいのですが。
> 
> # その前にZend社が対応してくれたら、嬉しいような悲しいような
> 
> ついでですが、スクリプトのエンコーディング自動変換機能に関しては只今悩み
> 中です。この処理はZend Engineの中(yyinputのwrapper)で行うのが望ましいと
> 思うのですが、Zend Engineがphp.iniを読みに行くのは非常にためらわれるので
> す(というか、許されないとおもわれます)。

こまかいところですが、

+ LABEL_SJIS    (([a-zA-Z_\x7f-\x80\xa0-\xdf\xfd-\xff])|([\x81-\x9f\xe0-\xfc][\x
40-\x7e\x80-\xfc]))(([a-zA-Z_\x7f-\x80\xa0-\xdf\xfd-\xff])|([\x81-\x9f\xe0-\xfc]
[\x40-\x7e\x80-\xfc]))*

SJISの1バイト目は
x21-x7e
xa1-xdf
あるいは
x81-x9f (x40-x7e|x80-xfc)
xe0-xef (x40-x7e|x80-xfc)
だと思うのですが、いかがでしょう。
x7f, x80,xa0,xfd-xffあたりは登場しないはづ?
(xf0-xfcはuser definedとして登場しますが)

> 何かよい考えがおありでしたらお聞かせください。

わたしの意見は、スクリプトのエンコーディングを自動検出するのは
Latin1等を考えると不可能だと思っています。国際化の観点から言うと
うけいれるのが難しい仕様かなと思っていますが、いかがでしょう。

ひとつのバイナリで世界中の文字が表現できるようにするためには、
やはりユーザーに陽にエンコーディングを記述してもらうというのが
流れかと思っています。デフォルトはその時は、UTF-8。

よ
--
Hiro Yoshioka/CTO, Miracle Linux
mailto:hyoshiok@miraclelinux.com
http://www.miraclelinux.com
カーネルプログラマ募集中