2010-08-14 25 views
8

Me gustaría escribir un script de Ruby que escriba caracteres japoneses en la consola. Por ejemplo:Caracteres Unicode en un script de Ruby?

puts "こんにちは・今日は" 

Sin embargo, me sale una excepción cuando se ejecuta:

jap.rb:1: Invalid char `\377' in expression 
jap.rb:1: Invalid char `\376' in expression 

¿Es posible hacerlo? Estoy usando Ruby 1.8.6.

Respuesta

12

Has guardado el archivo en la codificación UTF-16LE, el que Windows llama erróneamente "Unicode". Esta codificación generalmente se evita mejor porque no es un superconjunto ASCII: cada unidad de código se almacena como dos bytes, con caracteres ASCII que tienen el otro byte almacenado como \0. Esto confundirá una gran cantidad de software; es inusual usar UTF-16 para el almacenamiento de archivos.

Lo que está viendo con \377 y \376 (octal para \xFF y \xFE) es la secuencia de T + FEFF Byte marca de orden de poner al frente de UTF-16 archivos de distinguir UTF-16LE de UTF-16BE.

Ruby 1.8 está totalmente basado en bytes; no intenta leer caracteres Unicode desde un script. Por lo tanto, solo puede guardar archivos fuente en codificaciones compatibles con ASCII. Normalmente, querrá guardar sus archivos como UTF-8 (sin BOM, el faux-BOM UTF-8 es otra gran innovación de Microsoft que lo rompe todo). Esto funcionaría muy bien para los scripts en la web que producen páginas UTF-8.

Y si usted quiere asegurarse de que el código fuente sería tolerante de ser guardado en cualquier codificación compatible con ASCII, se puede codificar la cadena para que sea más resistente (si es menos legible):

puts "\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\xe3\x83\xbb\xe4\xbb\x8a\xe6\x97\xa5\xe3\x81\xaf" 

¡Sin embargo! Escribir en la consola es en sí mismo un gran problema. La codificación que se usa para enviar caracteres a la consola varía de una plataforma a otra. En Linux o OS X, es UTF-8. En Windows, es una codificación diferente para cada ubicación de instalación (como se seleccionó en "Idioma para aplicaciones que no son Unicode" en la entrada del panel de control "Opciones regionales y de idioma"), pero es nunca UTF-8. Esta configuración es, nuevamente, engañosamente conocida como la página de códigos ANSI.

Si está utilizando una instalación japonesa de Windows, la codificación de su consola será la página de códigos de Windows 932 (una variante de Shift-JIS). Si ese es el caso, puede guardar el archivo de texto de un editor de texto usando "ANSI" o explícitamente "Japanese cp932", y cuando lo ejecuta en Ruby obtendrá los caracteres correctos. Una vez más, si usted quiere hacer la fuente soportar misencoding, se podía escapar de la cadena en cp932 codificación:

puts "\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd\x81E\x8d\xa1\x93\xfa\x82\xcd" 

Pero si se ejecuta en una máquina en otro local, que va a producir diferentes personajes. No podrá escribir en japonés en la consola predeterminada de Ruby en una instalación de Western Windows (página de códigos 1252).

(Aunque Ruby 1.9 mejora mucho el manejo Unicode, aquí no cambia nada. Sigue siendo una aplicación basada en bytes que utiliza las funciones IO de la biblioteca estándar C, lo que significa que está limitada a la página de códigos locales de Windows).

+3

esto es unicode hombre en acción – mykhal