rubyで、チャット出来るプログラムを作りたいのですが文字化けの対処法が分からずいきなり躓いています。

投稿者: Anonymous

多人数がチャットできるプログラムを作ろうと、webサイトを参考にしながら作り始めたのですが、プロンプトで、日本語を入力するとサーバーに渡った文字が正しく表示されないです。どこがおかしいのでしょうか。

サーバー側 [sever.rb]

require "socket"
server = TCPServer.new(12345)
sockets = [server]
loop do
    r_sockets = IO.select(sockets)[0]
    r_sockets.each do |socket|
        case socket
        when TCPServer
            client = socket.accept
            sockets << client
        when TCPSocket
            unless socket.eof?
                p mes = socket.gets
                for i in sockets.drop(1)
                    i.puts mes
                end
            else
                socket.close
                sockets.delete(socket)
            end
        end
    end
end

クライアント側 [client.rb]

require 'socket'
$socket = TCPSocket.open("localhost",12345)
Thread.new{
    loop do
        $socket.puts(gets.chomp) if $socket
    end
}
while $socket
    p $socket.gets.chomp
end

解決

TCPSocket の入出力はバイナリデータとして扱われるので、文字データとして扱う場合は、読み込んだ文字列に対してエンコーディングを強制する必要があります。

文字コードとして UTF-8 を想定しているのであれば、

p $socket.gets.chomp.force_encoding("utf-8")

のようにすればいいと思います。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *