[PHP-dev 29] Re: ZendのSJIS 対応パッチを作ってみました
Masaki Fujimoto
php-dev@php.gr.jp
Wed, 04 Jul 2001 13:34:45 +0900
ふじもとです。
やっぱりまず機能仕様きめないとだめそうな感じですね。このスレッドがそのとっ
かかりになればよいな、と思っていますが。
On Wed, 04 Jul 2001 11:31:51 +0900
Hiro Yoshioka <hyoshiok@miraclelinux.com> wrote:
> よしおかです。
はじめまして。
> 自動検出にこだわらなければ
> zend_scan_charset()
> で陽にencodingをゲットする仕様にしてみたらいかがでしょう。
>
> すなわち、php スクリプトの先頭にキーワードをつけて
> たとえば、
> script_encoding=hogehoge;
> と書いてあれば、hogehoge エンコーディングだと決定すると。
> (script_encoding='hogehoge';とすべきかどうか?)
>
> これをパースするコストは非常に低いと思います。
なるほど。僕もスクリプトエンコーディングを明示するという方法も一応考えて
は見たのですが、
(1) php.iniに指定する場合
先程も書いたのですがZend Engineからphp.iniを読みに行くのはためらわれるの
で...
何より、スクリプトごとにエンコーディングは異なることが多々ありそうなので
これは却下ですね。
(2) よしおかさんの方法
これも実は一瞬考えたのですが、PHPの仕様自体に影響するので臆病な僕は却下
してしまいました。でも、これはいい方法ですよね。
こんな経緯があって、
- Zend Engine内部のみで解決する
- 既存のコードは変更しない(付け加えるのみ) == #if 0 等でデフォルト状態に
戻せる
という条件で作ってみました。
# が、よしおかさんの話を聞いているうちに気が変わってきました。PHPもネイ
ティブで国際化対応する流れのようですし。やってみます。
というわけで、「エンコーディング検出」は
スクリプト内で明示的に指定
# 明示的に指定されない場合は自動検出というのは構造的に厳しいものがありま
す。すみません。
という方向でもう一度作ってみます。
> > なにはともあれ、パッチを投げるにしても
> >
> > - 十分なテスト
> > - ベンチマーク
> > - ZTS対応
> > - CXXでのコンパイル対応(zend_language_scanner_cc.ccの変更)
> > - エンコーディング自動検出部分の改良
>
> ソースコードのピアレビュー
ごもっともです。
> こまかいところですが、
>
> + 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として登場しますが)
ごもっともです(ふたたび)。[a-zA-Z_\x7f-\xff](デフォルトのLABEL)から
SHIFT_JIS漢字の1バイト目を抜いたものをただ書いただけなのでした。修正しま
す。
ついでに、2バイト目以降は半角数字も使用できなければいけませんね。間違え
ていました。ということで、
LABEL_SJIS (([a-zA-Z_\xa1-\xdf])|([\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\x
fc]))(([a-zA-Z0-9_\xa1-\xdf])|([\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]))*
が正解でしょうか。(ユーザ定義文字は一応含めておきました)
今週は結構仕事が忙しいのでいつになるかは微妙ですが、いしいさん(!)にも賛
成していただいたようなのでscript_encodingディレクティブ方式のパッチを試
しにつくってみます。
--
Masaki Fujimoto
fujimoto@studio.co.jp
http://www.studio-m.com/