2012-06-27 21 views

回答

3

我相信​​使用read,这反过来又说:

所得字符串总是ASCII-8BIT编码。

这意味着你不需要指定IO#set_encoding,但你可以的,你看整个串后,迫使其编码(使用String#force_encoding!)到UTF-8

我强调'整体',因为您需要确保在字符串末尾读取完整的Unicode字符,就好像只读取了部分字符,您将获得无效的UTF-8字符,并且Ruby可能会抱怨关于它的更进一步。

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" 
+0

如果我用#read_nonblock逐一读取一个套接字的字节,IO#set_encoding是否会工作? – lcarpenter

+0

@lcarpenter,我不明白为什么不。你试过了,发现它没有? –

+0

啊,不,这个方法不太好用 – lcarpenter