From: Hidetoshi NAGAI Date: 2008-02-09T16:22:57+09:00 Subject: [ruby-list:44591] Re: Ruby初心者が作りました 永井@知能.九工大です. 脇からですが... From: "ODA Kaname" Subject: [ruby-list:44589] Re: Ruby初心者が作りました Date: Sat, 9 Feb 2008 13:42:12 +0900 Message-ID: <45a7e4b10802082042i58558a0ewe69befde49ba60fc@mail.gmail.com> > > * 日本語を含むコードなので一行目に「#! ruby -Ks」と入れてください。 > > 「$KCODE='s'」していますが、それでは遅いです。 > これはたとえば、 > > #!/usr/bin/env ruby > $KCODE = 'S' > .... > > というコードでもマズいということでしょうか? 日本語 EUC の場合はスクリプト先頭で $KCODE = 'e' でも 通常は何とかなりますが,Shift_JIS の場合はまずいです. スクリプトの実行は,スクリプト全体を読み込んで 構文を解析した後に行われます. SJIS では漢字 1 文字を構成する 2 バイトの内の 2 バイト目が '\' の文字コードと一致してしまう可能性があります. 例えば "表" という漢字がそうですので, スクリプト中に title = "価格表" などとあった場合, 漢字を正しく処理しない限りは title = ".....\" という形になって 本来の文字列末尾のダブルクォートがエスケープされてしまい, 結果としてシンタックスエラーになるはずです. だからこそ,るびきちさんが > > なぜなら、Rubyインタプリタがスクリプトを読む時点でスクリプトの文字コードが > > Shift_JISであることを認識する必要があるからです。 と書いていたわけです. ただ,この shebang での記述 (#! ruby -Ks) は require されるスクリプト/ライブラリ側に書いていても機能しません. ですので,require を実行する親スクリプト側で -Ks あるいは $KCODE='s' の状態にしておく必要があります. # Ruby 1.9 では日本語周りの対応方法が全く違ってきますので, # ご注意ください. もちろん「このライブラリを使うときは $KCODE='s' にしてください」 とする選択肢もありますが,それを忘れてもシンタックスエラーにだけは ならないように工夫することも不可能ではありません. 例えば ----< hogelib.rb >------------------------------------- orig_kcode = $KCODE $KCODE = 's' require 'hogelib-sjis' $KCODE = orig_kcode ------------------------------------------------------- として,SJIS を含む部分はすべて hogelib-sjis.rb に書くという方法 (もちろん利用の際は require 'hogelib' とする) があります. # 同じ手は,日本語を含まないメインスクリプトと # 日本語を含むスクリプトとで分割構成する形でも使えますよね. 上の例はオリジナルの $KCODE を保持するように書いてはいますが, スクリプトがマルチスレッドで動くように書かれている場合には 安全な形になっていませんから気をつけてください. まぁとにかく,日本語文字列として解釈をしなければならない時点に どの漢字コードの文字列を扱おうとしているかを Ruby が適切に知っていさえすればいいわけです. その視点で見さえすれば,うまくコントロールできるだろうと思います. -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp