Comportamiento extraño de los caracteres multibyte de Ruby Thin/Rack

La pregunta fue reescrita.

Estoy trabajando en un marco web simple y encontré un comportamiento extraño en Rack o en el servidor Thin que estoy usando.

Traté de simplificar el config.ru archivo tanto como pude para obtener el siguiente código que reproduce el extraño problema:

app = Proc.new do |env|
    content = "<p>عربي</p>"
    headers = {'Content-Type' => 'html/text; charset=utf-8', 'Content-Length' => content.length.to_s}
    [200, headers, [content]]
end

run app

El código anterior es un proceso Rack normal, con el contenido de un párrafo HTML que contiene una palabra árabe de cuatro letras. Ahora, ejecutando el servidor Thin: thin start, estaba esperando que la fuente de la página web fuera:

<p>عربي</p>

Mientras que resultó ser:

<p>عربي

Solo, sin la etiqueta de cierre. El servidor funciona correctamente si inserto una palabra en inglés en lugar de la árabe, por lo que llegué a la conclusión de que el problema está relacionado con la codificación o los caracteres multibyte del árabe.

Estoy usando Rubí 1.9.2. La codificación del archivo es UTF-8. Y Ruby funciona bien si lo intento. puts "<p>عربي</p>" en la consola sin el servidor Rack o Thin.

Entonces, el problema es simplemente la desaparición de una cantidad de caracteres después del texto árabe cuando se usa Rack and Thin + la cantidad de caracteres que desaparecen == la cantidad de caracteres árabes en el texto.

¿Alguna idea?

preguntado el 30 de junio de 12 a las 14:06

¿Y cuál es la codificación de la cadena en la línea 3? -

La línea 3 tiene la misma codificación del archivo, UTF-8 que todas las demás cadenas. -

Um... ¿no debería devolver siempre 2 como longitud? puts escribe \n al final de cada cadena. Me sorprende que la primera línea no devuelva 2 también. -

De todos modos, los caracteres ASCII normales se cuentan como uno solo, mientras que cada letra árabe se cuenta como dos caracteres separados, como si la codificación no fuera UTF-8. -

Entonces, ¿a qué estás configurando las codificaciones internas/externas para el stringio? -

2 Respuestas

¿Afecta la regulación de la 'Content-Length' => content.bytesize.to_s mejorar las cosas?

Respondido el 30 de junio de 12 a las 16:06

¡Sí! ¡Lo hace! Muchas gracias por eso. Lo siento, no pude votar eso, ¡necesita más reputación! Gracias a todos aquí. - Omar

Bueno, tienes que decirle a Ruby que la cadena tiene árabe. Utilizar el force_encoding método con cualquier codificación compatible con esos caracteres árabes:

str.force_encoding("nameOfArabicEncoding")

Respondido el 30 de junio de 12 a las 14:06

La codificación es solo UTF-8. Funciona bien para cadenas, el problema está en los objetos StringIO + $stdout, intenté configurar la codificación, que de todos modos es UTF-8, y realmente no sucede nada. - Omar

@Omar Espera. ¿Cuál es la codificación de su sistema? - Linuxios

¿Lugar? ¡No estoy seguro! Pero lo que sé es que estoy usando Ubuntu 11.10, si esto puede ayudar, Aptana Studio, usando UTF-8 como codificación de archivos predeterminada, configurando la codificación predeterminada como UTF-8 para mi Ruby 1.9.3 # encoding: utf-8 y todo funciona correctamente como se esperaba, excepto StringIO en el ejemplo anterior. - Omar

@Omar: Ejecuta esto y dame el resultado: puts IO.new(1).external_encoding. - Linuxios

Bueno, no devuelve nada. Solo el \n de puts, dejando una línea vacía. - Omar

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.