From: Hidetoshi NAGAI Date: 2008-01-30T10:19:46+09:00 Subject: [ruby-dev:33515] Re: 現在の script encoding の値を得る方法は? 永井@知能.九工大です. From: "NARUSE, Yui" Subject: [ruby-dev:33501] Re: 現在の script encoding の値を得る方法は? Date: Tue, 29 Jan 2008 19:51:30 +0900 Message-ID: <479F053A.7030705@airemix.com> > 「require したスクリプトの encoding」という概念が実際は何を指している > か、というのはおそらく Ruby 1.9 における一つの論点かと思います。よく言わ > れる「内部エンコーディング」のことだと思うのですが、Perl や Java なら > UTF-8 や UTF-16 で決まりますけれど、Ruby 1.9 は CSI なため、決まらないど > ころか、そのような一定の内部エンコーディングが存在しない可能性もあります。 まつもとさんに教えていただいた __ENCODING__ を試してみましたが, require されたファイルで定義されたメソッドから見た __ENCODING__ は require 完了後に他所から呼ばれてもきちんと保たれていますね. おっしゃる通り,「一定の内部エンコーディングは存在しない」と 解釈する方が良いようです. > 唯一高い確度で推定できるのが -K が指定されている場合で、これは -K のエン > コーディングだと思われますが。 なるほど. しかし,-K が指定されたかどうかはスクリプト側からはわからないので, これによって判断することはできないのが残念です. それとも私が忘れているだけで,得る方法が存在したでしょうか? > > わざわざ指定してもらわねばならないことを > > 増やしたくはないのですが, > > > > 「 Tk からの戻り値の encoding は Tk.encoding_system = で > > 明示してください. > > 明示がなければシステムに依存したデフォルトの > > Tk.encoding_system の encoding で返されます 」 > > > > とするのが妥当なところかもしれません. > > どなたか良いアイディアをお持ちの方はいらっしゃいませんか? > > Tk.encoding_system はシステム依存でなく、Encoding.default_external に一 > 致させておいた方がトラブルが少ないのではないかなぁと思います。 説明が足りませんでした. システムに依存したデフォルトの Tk.encoding_system は 通常は locale に依存して決まります. Encoding.default_external も通常は locale 依存で決まると 考えても良かったですよね? ですので,明示が無い場合は Encoding.default_external と 矛盾しない encoding が設定されるものと考えていました. ですが,-K オプションのことも考えると,おっしゃる通り 「明示がなければ tk を require した時点の Encoding.default_external で返すように設定されます」 とする方法もありなのかもしれません. でも,-E オプションが指定された場合を考えると, Encoding.default_external に合わせてしまうと スクリプト上で Tk からの戻値を利用 (文字列比較とか) する際に encoding を常に気にしなければならず,不便そうに感じます. どうするのがスクリプトを書く人の負担を最小限にするか, もう少し考える必要がありそうですね. # 多分,Tk.encoding_system と Encoding.default_external は揃えるが, # Tk → Ruby の受け渡しの encoding は独立に設定可能というようには # すると思います. # Tk → Ruby のデフォルトまで Encoding.default_external に # 揃えてしまうのが適切な判断かどうかという話です. > > また,もし上記のような対応とせざるをえないなら, > > 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 の結果に基づいて 対応を検索するようにすればなんとかなりそうです. # Encoding.aliases は対応関係のある全 encoding 名を網羅していると # 考えていいのですよね? 気にしていたのは直接対応する encoding ではなく, その replica が指定されたケース,あるいは 直接対応する encoding と共通の replica 元を持つものが 指定されたケースです. そうした場合には,replica 関係から直接対応する encoding を 検索して指定しなければならないように思うのですが, この関係はスクリプト上からは調べようがないのですよね? それとも,replica に対する私の捉え方が不適切で, もし関係がわかったとしてもそれを選択してはならないのでしょうか? 対応できるものが全く存在しない場合は UTF-8 にするか例外を上げるかだとは思いますが... -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp