ruby - 如何在 Ruby 中通过 TcpSocket 发送 UTF-8 编码的字符串

标签 ruby sockets encoding character-encoding

如何在 Ruby 中通过 TcpSocket 发送 UTF-8 编码的字符串?当我尝试使用以下代码时

msg = $stdin.gets.chomp
@server.puts(msg.encode('utf-8'))

它为我提供了服务器上的“ASCII-8BIT”编码:

msg = client.gets.chomp
puts msg.encoding

输出

ASCII-8BIT

为什么?我做错了什么?

最佳答案

通过连接发送的数据只是组成字符串的原始字节,而不是客户端与它们关联的编码。因此,服务器无法确定编码应该是什么,并且默认为 ASCII-8BIT,这实际上意味着未知。

如果您知道数据始终为 UTF-8,则可以使用 set_encoding在套接字上始终将接收到的数据标记为正确的编码:

client.set_encoding('UTF-8')
msg = client.gets.chomp

如果每个客户端的数据可能采用不同的编码,您将需要制定一些协议(protocol),客户端在发送实际数据之前告诉服务器该编码是什么。然后服务器可以像上面一样使用set_encoding,或者使用 force_encoding在结果字符串上。

关于ruby - 如何在 Ruby 中通过 TcpSocket 发送 UTF-8 编码的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25303943/

相关文章:

ruby - 仅从字符串中删除 anchor 标记

objective-c - 如何在 C 或 Objective C 中的 IP/UDP 数据包中构建、格式化我自己的数据包?

javascript - 你什么时候应该使用转义而不是 encodeURI/encodeURIComponent?

python - 如何使用 python 将图片字节包含到 JSON? (编码问题)

c - 关于UDP接收包时buffersize的问题

python - 如何使用python读取从网络复制到txt文件的文本

ruby - 使用 MacPorts 在 Mac OS X 上安装 RMagick

ruby - 尽管将历史大小设置为 0 并清除历史记录,但 Mechanize 内存泄漏

ruby - 我如何在 RSpec 中测试我加载的代码是否有任何 Ruby 警告?

python - 客户端只向服务器发送一次数据