From: nobu.nakada@... Date: 2002-03-16T16:55:21+09:00 Subject: [ruby-list:34454] Re: 文字コード混在スクリプトの実行 なかだです。 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: -*- > に従うなら、「-Ks」は > #!ruby > # -*- coding: -*- > と読み替える。(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はできる。 中田 伸悦