当服务器发送 UTF-8 字节时,如何在字符不变成纯字节的情况下读取它们?(\x40 等)
问问题
1817 次
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_nonblock
uses read
,这反过来又说:
结果字符串始终为 ASCII-8BIT 编码。
这意味着您不需要指定IO#set_encoding
,但是您可以在读取整个字符串后,将其编码(使用String#force_encoding!
)强制为UTF-8
.
我强调了“整体”,因为您需要确保在字符串末尾读取整个 Unicode 字符,就好像只读取了其中的一部分一样,您将得到无效的 UTF-8 字符,Ruby 可能会进一步抱怨它线。
于 2012-06-28T06:04:47.797 回答