なかだです。

At Sat, 16 Mar 2002 23:09:18 +0900,
Take_tk wrote:
> そうです。だから、あまり現実的な方法ではありませんが、requireの
> 前に$KCODEを設定してやれば、正しくパースできます。
> 
> ということは、中村さんの場合に
> 
> 3) EUC, SJIS 混在
>    body.rb  EUC  (for UNIX and Win)
>    ui_1.rb  EUC  (for UNIX)
>    ui_2.rb  SJIS (for Win)
> 
> で次のようにすればうまくいくということでしょうか?。

です。requireは成功するということです。

> 正しくパースはできる(パース時のエラーで落ちることはない)が、実行時に処
> 理系が想定している $KOCDE とデータとして入っている文字列のコードとが異な
> るので、実行時におかしくなる。ということでは?。

そこまでは$KCODEではカバーしませんから。$KCODEが設定されている
からといって、自動的なコード変換などは起きません。

> > (B)ただし、トップレベルのスクリプトの場合には、$KCODE も変更する。
> > (というか、$KOCDE=="n" の時には -Ks で変更する)。
> 
> この"n"の時には、ってのがちょっと意味がよく分からなかったんです
> が、DEFAULT_KCODEがNONEじゃないときには-Kで変更しないということ?
> 
>  次のように変更します。
> 
>  (B)ただし、トップレベルのスクリプトの場合には、$KCODE も変更する。
> require で呼び出されたスクリプトでは、$KOCDE=="n" の時にだけ -Ks で変更
> する。

"n"というか、$KCODEが変更されていないとき、ということでしょうか。

>  $KCODE 決定の順位は次のようになります。(たけ(tk)案、念のため)。
> 
> (1)コマンドラインオプション/トップレベルスクリプトの -Kx
> (2)ruby.so のデフォルト
> (3)require されたスクリプトで最初に -Ks を有するものの指定。

つまり、-Kオプションを持っているスクリプトをrequireするだけで、
$KCODEが変わってしまうということですか。それはちょっと、という
気がしますが。

あと、(2)と(3)は逆でないと意味ないのでは。

> > (D)require で呼ばれたスクリプトの記述コード(-Ks)と require が実行され
> > た時点での記述コード($KCODE)とが異なる場合には、(4)のパースの時に文字
> > コードの変換(-Ks → $KCODE)を行う。
> 
> これはちょっと疑問です。必要なのであれば変換を明示したほうがい
> いのではないかと思ってます。
> 
>  sjis のスクリプトでパース時に変数に保存された文字列(sjis)を実行時の
> エンコーディング(EUC)で処理しても問題がなければ、変換は必要ではない、
> ですけど・・。

処理によりますね。正規表現などには問題があるかも。あとは、文字
列中の式展開(#{})なんかもまずいことになる可能性があるかも。

しかし逆に、意図しない変換が勝手に行われることによる問題もある
と思います。文字列としての値や長さは変わってしまいますし。

> そもそも、requireが実行された時点でのエンコーディングに変換して
> しまっていいのでしょうか。a.rb->b.rb->c.rbとrequireされる場合、
> c.rbのリテラルはb.rbのエンコーディングに合わせるべきなのでしょ
> うか。
> 
>  b.rb のエンコーディングではなく $KCODE(a.rb の -Ks)に合わさるはず。
> 
>  トップレベルの a.rb で -Ks が指定されていない場合には、b.rb(最初に見
> つかった -Ks 指定のあるスクリプト)のエンコーディングに従うことになる。
> a.rb で指定されていないということは、日本語を使っていない、または、どの
> エンコーディングにでも対応できる、ということなので、最初に見つかった -Ks 
> を $KCODE として、実行時の標準としても構わないと思う。

では、a.rbで-Knが指定されていたら?

> ソースのエンコーディング自体を変更したときに修正するのが面倒だ
> ということであれば、コンパイル時に決定される疑似変数(__CODING__
> とか)を導入するということも考えられます。
> 
>  ??、ruby.so をコンパイルする話?。

スクリプトを内部表現にコンパイルするときの話です。つまりloadし
たときの$KCODEを、__FILE__のように得られるようにするという意味
です。

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦