2012-06-27 24 views

Trả lời

3

Tôi tin read_nonblock sử dụng read, mà lần lượt nói:

Chuỗi kết quả luôn luôn là ASCII-8 bit mã hóa.

Có nghĩa là bạn không cần phải xác định IO#set_encoding, nhưng mà bạn có thể, sau khi bạn đọc toàn chuỗi, buộc mã hóa của nó (sử dụng String#force_encoding!) để UTF-8.

Tôi nhấn mạnh 'toàn bộ', vì bạn cần đảm bảo rằng bạn đọc toàn bộ ký tự Unicode ở cuối chuỗi, như thể một phần của nó được đọc, bạn sẽ nhận được ký tự UTF-8 không hợp lệ và Ruby có thể khiếu nại về nó tiếp tục xuống dòng.

4

Bạn có thể sử dụng IO#set_encoding để đặt mã hóa ngoài của socket thành 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

IO # set_encoding có hoạt động nếu tôi đang đọc các byte tắt của một socket một-by-one với #read_nonblock không? – lcarpenter

+0

@lcarpenter, tôi không hiểu tại sao không. Bạn đã thử nó và thấy rằng nó không? –

+0

Ah, không, phương pháp này không hoàn toàn hoạt động – lcarpenter

Các vấn đề liên quan