2012-06-27 9 views

Odpowiedz

3

wierzę read_nonblock wykorzystuje read, co z kolei mówi:

Otrzymany ciąg jest zawsze kodowania ASCII 8BIT.

Co oznacza, że ​​nie trzeba określać IO#set_encoding, ale że można, po przeczytaniu cały łańcuch, życie jego kodowanie (używając String#force_encoding!) do UTF-8.

Podkreśliłem "cały", ponieważ musisz upewnić się, że czytasz cały znak Unicode na końcu łańcucha, tak jakby przeczytano tylko jego część, otrzymasz nieprawidłowy znak UTF-8, a Ruby może narzekać o tym dalej.

4

Możesz użyć IO#set_encoding, aby ustawić zewnętrzne kodowanie gniazda na 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

Czy funkcja IO # set_encoding działa, jeśli czytam bajty off gniazda jeden po drugim z #read_nonblock? – lcarpenter

+0

@lcarpenter, nie rozumiem, dlaczego nie. Czy próbowałeś go i okazało się, że tak nie jest? –

+0

Ach, nie, ta metoda nie działa poprawnie – lcarpenter

Powiązane problemy