サーバーが UTF-8 バイトを送信するとき、文字が純粋なバイトにならずにそれらを読み取るにはどうすればよいですか? (\x40 など)
1817 次
2 に答える
4
私はread_nonblock
を使用していると信じてread
います。
結果の文字列は常に ASCII-8BIT エンコーディングです。
つまり、 を指定する必要はありませんが、文字列全体IO#set_encoding
を読み取った後、そのエンコーディングを ( を使用して) に強制することができます。String#force_encoding!
UTF-8
文字列の最後にある Unicode 文字全体を確実に読み取る必要があるため、「全体」を強調しました。文字列の一部だけが読み取られると、無効な UTF-8 文字が取得され、Ruby がそれについてさらに文句を言う可能性があります。この線。
于 2012-06-28T06:04:47.797 に答える
4
IO#set_encodingを使用して、ソケットの外部エンコーディングを UTF-8 に設定できます。
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'socket'
server_socket = TCPServer.new('localhost', 0)
Thread.new do
loop do
session_socket = server_socket.accept
session_socket.set_encoding 'ASCII-8BIT'
session_socket.puts " ᚁ ᚂ ᚃ ᚄ ᚅ ᚆ ᚇ ᚈ ᚉ ᚊ ᚋ ᚌ ᚍ"
session_socket.close
end
end
client_socket = TCPSocket.new('localhost', server_socket.addr[1])
client_socket.set_encoding 'UTF-8'
p client_socket.gets
# => "| ᚁ ᚂ ᚃ ᚄ ᚅ ᚆ ᚇ ᚈ ᚉ ᚊ ᚋ ᚌ ᚍ\n"
于 2012-06-27T13:04:55.500 に答える