当服务器发送UTF-8字节时,如何在没有字符成为纯字节的情况下读取它们? (\ x40等)
答案 0 :(得分: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"
答案 1 :(得分:3)
我相信read_nonblock
使用read
,后者又说:
结果字符串始终是ASCII-8BIT编码。
这意味着您无需指定IO#set_encoding
,但在阅读整个字符串后,您可以强制其编码(使用String#force_encoding!
)到{{ 1}}。
我强调'整体',因为您需要确保在字符串末尾读取整个Unicode字符,好像只读取其中的一部分,您将获得无效的UTF-8字符,而Ruby可能会抱怨它更进一步。