5

サーバーが UTF-8 バイトを送信するとき、文字が純粋なバイトにならずにそれらを読み取るにはどうすればよいですか? (\x40 など)

4

2 に答える 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 に答える