2012-06-27 10 views

risposta

3

credo read_nonblock utilizza read, che a sua volta dice:

La stringa risultato è sempre la codifica ASCII-8BIT.

Il che significa che non è necessario specificare IO#set_encoding, ma che si può, dopo aver letto tutta la stringa, forzare la sua codifica (usando String#force_encoding!) per UTF-8.

Ho sottolineato "intero", poiché è necessario assicurarsi di leggere l'intero carattere Unicode alla fine della stringa, come se fosse letto solo una parte, si otterrà il carattere UTF-8 non valido e Ruby potrebbe lamentarsi su di esso più in basso.

4

È possibile utilizzare IO#set_encoding per impostare la codifica esterna di un socket su 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

Sarebbe IO # set_encoding funzionare se sto leggendo i byte di un socket uno alla volta con #read_nonblock? – lcarpenter

+0

@lcarpenter, non vedo perché no. Hai provato e trovato che non lo fa? –

+0

Ah, no, questo metodo non funziona abbastanza – lcarpenter

Problemi correlati