なかだです。

At Sat, 16 Mar 2002 15:46:15 +0900,
Take_tk wrote:
> > 文字コード混在のスクリプトを実行したいのですが、
> > どういう方法があるでしょうか?
> > (-K? の指定と require する漢字コードが異なったまま
> > 混在させることはできるか?)
> 
> 今のところできません。「[ruby-list:34323] 英語化プロジェクト/
> リサイクル計画。」でも紹介されているように、ruby-devでもそうい
> う話が出てはいますが、どう指定するかの仕様案の段階です。どうい
> うのがいいと思いますか。
> 
>  パース、実行の順番がよくわからないのですが、
> 
>    body.rb       EUC  (for UNIX)
>      #!ruby -Ke
>      ... require の前のスクリプト
>      require "ui"
>      ... require の後のスクリプト
> 
>    ui.rb       SJIS (for Win)
>       #!ruby -Ks
>       ....
> 
> となっているとき次のような手順と考えていいのでしょうか?。
> 
> (1)body.rb のパース。そのファイル全体の文字列の解釈は終わる。
> (2)body.rb の実行 → require の前のスクリプト
> (3)body.rb の実行 → require の実行
> (4)ui.rb のパース。ui.rb 全体の文字列解釈は終了する。
> (5)ui.rb の実行
> (6)body.rb の実行 → require の後の行のスクリプト

そうです。だから、あまり現実的な方法ではありませんが、requireの
前に$KCODEを設定してやれば、正しくパースできます。

> [ruby-list:34323]
> >   # -*- coding: <encoding name> -*-
> に従うなら、「-Ks」は
>    #!ruby
>    # -*- coding: <sjis> -*-
> と読み替える。(sjis はテキトー)。

これを前提とします。

> (A)#!ruby -Ks は原則として「そのファイルの記述コード」の指定のみとす
> る。

はい。

> (B)ただし、トップレベルのスクリプトの場合には、$KCODE も変更する。
> (というか、$KOCDE=="n" の時には -Ks で変更する)。

この"n"の時には、ってのがちょっと意味がよく分からなかったんです
が、DEFAULT_KCODEがNONEじゃないときには-Kで変更しないということ?

> (C)$KCODE はそのスクリプト群全体のあるべき文字コードとする。

「実行時点での」というほうが正確ですが、全体で統一することを考
えれば、ほぼそういってもいいかも知れません。

> (D)require で呼ばれたスクリプトの記述コード(-Ks)と require が実行され
> た時点での記述コード($KCODE)とが異なる場合には、(4)のパースの時に文字
> コードの変換(-Ks → $KCODE)を行う。

これはちょっと疑問です。必要なのであれば変換を明示したほうがい
いのではないかと思ってます。

そもそも、requireが実行された時点でのエンコーディングに変換して
しまっていいのでしょうか。a.rb->b.rb->c.rbとrequireされる場合、
c.rbのリテラルはb.rbのエンコーディングに合わせるべきなのでしょ
うか。

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

> (E)require を実行よりまえにそのファイル全体の文字列解釈が終了している
> のであれば、-Ks のデータを保存しておく必要はない。

このデータというのは、そのファイルの先頭で指定されたエンコーディ
ングのことですか?

> (F)もし、require から返ってきた後に文字列の解釈が必要になるのであれば、
> require するときに(3)、そのファイルの記述コード(-Ks)を保存しておき、
> require から戻ってきたときには(6)、元の記述コードの戻して文字列の解釈
> (パース?/実行?)を継続する。

requireすると$KCODEが自動的に変わってしまうというのはまずいと思
うので、(3)、(4)の前後ではエンコーディングは保存されるべきだと
思います。ただし、(5)の実行中の変更は(6)でも有効になるべきでは
ないでしょうか。

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