5

当服务器发送 UTF-8 字节时,如何在字符不变成纯字节的情况下读取它们?(\x40 等)

4

2 回答 2

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 回答
4

我相信read_nonblockuses read,这反过来又说:

结果字符串始终为 ASCII-8BIT 编码。

这意味着您不需要指定IO#set_encoding,但是您可以在读取整个字符串后,将其编码(使用String#force_encoding!)强制为UTF-8.

我强调了“整体”,因为您需要确保在字符串末尾读取整个 Unicode 字符,就好像只读取了其中的一部分一样,您将得到无效的 UTF-8 字符,Ruby 可能会进一步抱怨它线。

于 2012-06-28T06:04:47.797 回答