From: "NARUSE, Yui" Date: 2008-01-30T11:23:38+09:00 Subject: [ruby-dev:33516] Re: 現在の script encoding の値を得る方法は? 成瀬です。 Hidetoshi NAGAI wrote: >> 唯一高い確度で推定できるのが -K が指定されている場合で、これは -K のエン >> コーディングだと思われますが。 > > なるほど. > しかし,-K が指定されたかどうかはスクリプト側からはわからないので, > これによって判断することはできないのが残念です. > それとも私が忘れているだけで,得る方法が存在したでしょうか? えーっと、KCODE_CHECKER ="\x80" とか書いたファイルを置いて、それを読み込 むとか。-K が指定されていると デフォルトの script encoding が与えられる ので、KCODE_CHECKER.encoding が ASCII-8BIT 以外になります。存在はするけ どー、という感じですね(ぉぃ > でも,-E オプションが指定された場合を考えると, > Encoding.default_external に合わせてしまうと > スクリプト上で Tk からの戻値を利用 (文字列比較とか) する際に > encoding を常に気にしなければならず,不便そうに感じます. -E に合わせて変わるべき、と言う主張でした。独立するべきと言う主張も一理 あるとは思います。 >>> また,もし上記のような対応とせざるをえないなら, >>> Ruby の encoding -> Tcl/Tk の encoding の対応表が必要です. >>> これを安全確実に作成し維持できるようにするために, >>> うまい方法はないでしょうか? >> tk_encoding.each do |name| >> enc = Encoding.find(name) >> puts '%s -> %s' % [enc.to_s, name] >> end >> これで作れます。 > > あ,ごめんなさい. > tk の encoding 名に基づいて,Encoding.find を使って > 直接対応する encoding を得ることはわかります. > aliase についても Encoding.aliases の結果に基づいて > 対応を検索するようにすればなんとかなりそうです. '%s -> %s' % [enc.to_s, name] となっているところに意図があって、実際は Ruby 側の encoding から Tk 側の encoding にちゃんとなっています。 r2t_table = {} tk_encoding.each do |name| enc = Encoding.find(name) r2t_table[enc] = name end def rubyenc2tkenc(name) r2t_table[Encoding.find(name)] end これで、alias も考慮して Ruby の encoding name から tk の encoding name が取れます。 > # Encoding.aliases は対応関係のある全 encoding 名を網羅していると > # 考えていいのですよね? 網羅していなかったらバグなので教えてください。私の気付いた範囲では網羅さ せているはずです。 > 気にしていたのは直接対応する encoding ではなく, > その replica が指定されたケース,あるいは > 直接対応する encoding と共通の replica 元を持つものが > 指定されたケースです. > そうした場合には,replica 関係から直接対応する encoding を > 検索して指定しなければならないように思うのですが, > この関係はスクリプト上からは調べようがないのですよね? > それとも,replica に対する私の捉え方が不適切で, > もし関係がわかったとしてもそれを選択してはならないのでしょうか? えぇ、関係があったとしてもそれを選択してはなりません。replica 関係では基 本的に CES についてしか見ていませんから、同じ CES でも全く違う文字集合が 入っている場合にはうまくいかなくなります。 一応注意すれば replica 関係で fallback を構成することは可能だとは思うの ですが、全ての encoding を知っているわけでもないので、現時点でそういった 機構を期待させてしまうのは危険だと感じています。また、ようは(chr)1000 み たいなキャストをやっていることに他ならないので、明示的に指定してほしい なぁという思いもあります。 現時点での replica は、あくまで encoding 実装上の都合で、ユーザが見るも のではない、ということになっていると思います。 -- NARUSE, Yui DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA