2012-06-27 16 views

Respuesta

3

creo read_nonblock utiliza read, que a su vez dice:

La cadena resultado es siempre ASCII-8BIT codificación.

Lo que significa que no es necesario especificar IO#set_encoding, pero que se puede, después de leer toda cadena, forzar su codificación (usando String#force_encoding!) a UTF-8.

Destaqué 'todo', ya que necesita asegurarse de leer todo el carácter Unicode al final de la cadena, como si solo se lea una parte, obtendrá un carácter UTF-8 no válido y Ruby podría quejarse sobre eso más adelante en la línea.

4

Puede usar IO#set_encoding para establecer la codificación externa de un socket en 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

¿Funcionaría IO # set_encoding si estoy leyendo los bytes de un socket uno a uno con #read_nonblock? – lcarpenter

+0

@lcarpenter, no veo por qué no. ¿Lo has probado y has descubierto que no? –

+0

Ah, no, este método no funciona bien – lcarpenter

Cuestiones relacionadas