[ruby-list:49018] Re: 文字コード変換で煮詰まっています。

From: "U.Nakamura" <usa@...>
Date: 2012-11-27 06:42:59 UTC
List: ruby-list #49018
こんにちは、なかむら(う)です。

In message "[ruby-list:49017] 文字コード変換で煮詰まっています。"
    on Nov.27,2012 15:25:10, <KHB15150@nifty.ne.jp> wrote:
> つなぐサーバーの文字コードはUTF8なのですが、コンソールで文字化けするため、

お使いのrubyは1.8ということでしょうか?

この辺は1.8までとそれ以降で大きく変化したところですので、その
あたりの情報が重要です。
質問する時点でどの情報が重要でどの情報が不要かはもちろん質問
者にはわかるはずもありませんが、とりあえず、質問される際には
ruby -vの出力を添えられることをお勧めします。


> てこずっているのが送信側で、
> 
> send_cmd("PRIVMSG #{@channel} #{Kconv.tojis(input)}")
> 
> ここをsjisに変えたら、送信できるようになりましたが、IRC側で文字化けします。

ここはIRCサーバー側が期待している(というか使うチャンネルにお
ける紳士協定で要求されている)エンコーディングに変換する必要が
あるわけなので、仮にIRCサーバー側がjis(ISO-2022-JP)を期待して
いるなら、ここは変えてはいけないのではないでしょうか。
もしIRCサーバー側がUTF-8を期待しているならば、toutf8ですね。

それでも化ける場合、元の文字列のエンコーディングの推測に失敗
していることが考えられるので、それを指定してやると解決するか
もしれません。
具体的には、

> while msg = Kconv.toutf8(@irc.gets).split

を

  while msg = Kconv.kconv(@irc.gets, Kconv::SJIS, Kconv::JIS)

にして、

> send_cmd("PRIVMSG #{@channel} #{Kconv.tojis(input)}")

を

  send_cmd("PRIVMSG #{@channel} #{Kconv.kconv(input, Kconv::JIS, Kconv::SJIS)}")

にする感じです。
IRCサーバー側のエンコーディングがISO-2022-JPでなければそれに
合わせてKconv::JISをKconv::UTF8なりに変えてください。


なお、元のスクリプトですが、

  while msg = Kconv.toutf8(@irc.gets).split
    p msg.join(' ')
    send_cmd("PONG #{msg[1]}") if msg[0] == 'PING'
  end

この部分、受け取ったメッセージのエンコーディングを変更しちゃ
ってPONGで返してるのでまずいと思います。

  while msg = @irc.gets.split
    p Kconv.toutf8(msg.join(' '))
    send_cmd("PONG #{msg[1]}") if msg[0] == 'PING'
  end

じゃないといけないんじゃないかなあ。
(toutf8は環境に合わせて変更して下さい)


それでは。
-- 
U.Nakamura <usa@garbagecollect.jp>


In This Thread