当服务器发送UTF-8字节时,如何在没有字符变为纯字节的情况下读取它们? (\ x40等)在Ruby中,如何从套接字读取UTF-8?
回答
我相信使用read
,这反过来又说:
所得字符串总是ASCII-8BIT编码。
这意味着你不需要指定IO#set_encoding
,但你可以的,你看整个串后,迫使其编码(使用String#force_encoding!
)到UTF-8
。
我强调'整体',因为您需要确保在字符串末尾读取完整的Unicode字符,就好像只读取了部分字符,您将获得无效的UTF-8字符,并且Ruby可能会抱怨关于它的更进一步。
您可以使用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"
如果我用#read_nonblock逐一读取一个套接字的字节,IO#set_encoding是否会工作? – lcarpenter
@lcarpenter,我不明白为什么不。你试过了,发现它没有? –
啊,不,这个方法不太好用 – lcarpenter
- 1. 从C读取套接字
- 2. 从套接字读取
- 3. wxWidgets从套接字读取
- 4. 从TCP套接字读取
- 5. 从套接字块读取
- 6. 从Ruby中的Unix套接字读取/写入
- 7. 从Rust中的套接字读取
- 8. 从C中telnet套接字读取
- 9. 从套接字中迭代读取()
- 10. PHP:从套接字或STDIN中读取
- 11. 从vxworks中的ftp套接字读取
- 12. 从C#中的套接字读取#
- 13. 无法从套接字中读取
- 14. 如何从Python中的套接字读取字节数组
- 15. 如何从Haskell中的套接字读取字节
- 16. 如何从Python中的套接字读取原始字节?
- 17. 如何从java中的蓝牙套接字读取字符串
- 18. 如何从套接字连接读取字典列表?
- 19. 从套接字关闭后从套接字读取数据
- 20. 在Ruby中读取套接字时了解IO.select
- 21. 从套接字读取一个字节
- 22. 从套接字读取到字符串
- 23. 从Java的套接字读取字节
- 24. Ruby - 从多个套接字读取(irc bot)
- 25. 如何重复读取套接字?
- 26. 如何在必要时仅从套接字读取数据
- 27. 如何从多次读取接收套接字数据?
- 28. Java套接字写入然后从套接字读取
- 29. Java套接字从套接字实时读取
- 30. 如何从流(tcp)套接字读取确切的字节数?
您如何阅读套接字? – Reactormonk
IO :: select()和IO#的组合#read_nonblock – lcarpenter