在Ruby中,如何从套接字读取UTF-8?

时间:2012-06-27 12:08:26

标签: ruby sockets utf-8

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

2 个答案:

答案 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可能会抱怨它更进一步。