たけ(tk)です。

[ruby-list:34450] Re: 文字コード混在スクリプトの実行 にて 
nobu.nakada / nifty.ne.jp さん 曰く:
》> 文字コード混在のスクリプトを実行したいのですが、> どういう方法があるでしょうか?> (-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 の後の行のスクリプト

もしこうであるなら、

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

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

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

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

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

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

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

Take_tk = KUMAGAI Hidetake
たけ(tk)=熊谷秀武