[#44578] Ruby初心者が作りました — Kabu and Ruby管理人 <kabu_and_ruby@...>

http://www.geocities.jp/kabuandruby/index.html

26 messages 2008/02/06

[#44691] ”Rubyアプリケーションプログラミング”の伝言サーバの使い方 — "Yangkook Kim" <yangkookkim@...>

キムと申します。オーム社から出版されている書籍、"Rubyアプリケーションプログラミング"のP267~275に掲載されている伝言サーバー&クライアントの利用の仕方がわかりません。質問を要約すると次の2点です。1、サーバーが正常に起動されているかどうかわからない。2、書き込みクライアントで入力をサーバーに送信する方法がわからない。

8 messages 2008/02/24

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

From: Hidetoshi NAGAI <nagai@...>
Date: 2008-02-09 07:22:57 UTC
List: ruby-list #44591
永井@知能.九工大です.

脇からですが...

From: "ODA Kaname" <oda@londobell.net>
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

In This Thread