2008年2月 9日

[ruby-list:44591] Re: Ruby初心者が作りました

永井@知能.九工大です.

脇からですが...

From: "ODA Kaname" <oda@xxxxx>
Subject: [ruby-list:44589] Re: Ruby初心者が作りました
Date: Sat, 9 Feb 2008 13:42:12 +0900
Message-ID: <45a7e4b10802082042i58558a0ewe69befde49ba60fc@xxxxx>

> > * 日本語を含むコードなので一行目に「#! 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@xxxxx

投稿者 xml-rpc : 2008年2月 9日 16:22
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/69628
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。