From: "NARUSE, Yui" Date: 2008-01-15T04:30:00+09:00 Subject: [ruby-dev:33107] Re: String#valid_encoding? shoud be strict? 成瀬です。 Masayoshi Takahashi wrote: > 高橋征義です。1.9のエンコーディングとString#valid_encoding?について。 > > 【背景】 > 入力チェック等で、ある文字列があるエンコーディングの範囲内に > おさまっているか、厳格にチェックしたい場合があります。 > (おさまっていない場合は再入力をうながしたり、「?」に強制的に > 置換したりします)。 > > 【提案】 > というわけで、例えば String#valid_encoding? で厳格なチェックが > できるとうれしいです。具体的には、Shift_JISで、JISにない文字 > (いわゆる機種依存文字)が含まれている場合、falseになると > いった具合です。 そういったニーズはわかるのですが、そういった validation に必要なデータ量 は Ruby 本体が持つには大きすぎるように感じます。Shift_JIS ですら 0x8140-0x9fEC, 0xE040-0xEAA4 まできっちり詰まっているかと思いきや、非漢 字のあたりはちらほら穴があいているので、そこの情報も必要です。Unicode だ となおさら。 > 【備考】 > これって、Windows-31JがShift_JISのreplicaそのままでいいのか > どうか問題にかかわってくるんですよね。上記のような理由も > あって、私はWindows-31JとShift_JISはまるっきり同じ、ではない > 方がいいと思っています。 > もっとも、じゃあISO-2022-JPの厳格な解釈は?とか、いろいろ > 問題が出てくるとは思いますが……。 replica という語感が誤解を生みやすいのかもしれませんが、Ruby 本体が (と いうよりは鬼車が) 関心を持っているのは文字がどこで切れるか、言いかえれば どのような符号化表現を用いているかです。その encoding (というか charset というか 文字集合) において実際に文字が定義されているかどうかはどうでも いいのです。そして、Shift_JIS も Windows-31J もどちらもシフト符号化表現 を用いている以上まるっきり同じものです。EUC-CN は EUC-KR の replica です しね。 図にすると [ruby-dev:32952] みたいなかんじ。 そういった性質を持つ以上、現在の valid_encoding? に文字集合への内包性 チェックを求めるのは違うと思います。むしろ、妥当性をチェックしないのに valid を名乗るのが間違っているのではないかという批判はありえる話で、 well_formed_encoding? とした方がいいのではないかと提案しようと思ったもの のあまりの名前の長さにやめたのですが、well_formed? なら短いので、名前を 変えませんか。 well-formed XML からの連想で validation を行わず Character Encoding Form (Scheme) のみを判定するのだろうと推測してくれることが期待できます。 > いずれにしても、最悪上記【背景】に書いたことを解決するのが > 目的です。それができるのなら、 String#valid_encoding? 以外の > 手段を使うのであっても構いません。 ところで、他にどのコードポイントが存在し、どれが存在しないかを知っている のは、文字コード変換機あたりが考えられるかと思います。多くのエンコーディ ングでは、それが Unicode に変換可能かで妥当性をチェックできる…かのように 思えますが、それで本当にいいのですかね。まず、encoding を注意深く選ばな いと、期待した集合は得られません。EUC-JP だとたぶん JIS X 0212 が余計で すし (Perl/Encode だと JIS X 0213 まで入ってる)、Shift_JIS でも nkf や 現在の Ruby/transcode だと CP932 拡張も変換します。そもそも、いわゆる半 角カナや全角英数字も期待している集合に入っていないんじゃないですか。 結局のところ、そういった validation は専門のモジュールに任せるべきで、汎 用の何かに求めるべきではないと思います。で、何を使えばいいかですが・・・ Ruby/CHISE かな・・・? それもアレなんで、必要ならば nkf につっこみますかねぇ。(どうせ内部は区 点コードだし) -- NARUSE, Yui DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA