Ahora que instalé Ruby 1.9, me puse a hacer algunas pruebas. En una de esas, utilicé caracteres con acento en mis cadenas y al correr el programa, ¡bam! que me sale esto:
invalid multibyte char (US-ASCII)
Y yo con mi cara de WTF?!
Al cabo de un rato de investigar, entendí por qué sucedía esto.
El problema
Ruby 1.9 trae ya soporte para múltiples codificaciones de caracteres (character encodings). Pero —siempre hay un pero— hay que indicarle cúal es el que va a utilizar.
Esta forma de trabajar se creó para resolver el problema en el que yo escribo mi código en UTF-8, y un japonés escribe su código en Shift JIS. Ruby debería soportar eso, de hecho, la versión 1.9 lo hace. Vamos a complicar las cosas un poco más: imagina que pongo el código que escribí en UTF-8 en una gema y luego el programador japonés la utiliza en su código escrito en Shift JIS. ¿Cómo podemos hacer que trabajen ambos sin problemas?
La estrategia de Ruby 1.8 de usar una variable global para especificar la codificación no sobreviviría a una prueba como esa, era momento de un cambio de estrategia. La respuesta de Ruby 1.9 a este problema es la codificación (encoding) del código fuente.
Todo código fuente en Ruby tiene cierta codificación. Cuando creas una cadena en tu código, automáticamente le es asignada esa codificación. Esa sencilla regla resuelve adecuadamente los problemas que he descrito. Mientras la codificación de mi código fuente sea UTF-8 y la del programador japonés sea Shift JIS, mis cadenas de texto trabajarán como es debido y las de él también. Obviamente si compartimos datos, tendremos que establecer algunas reglas acerca de los formatos que compartiremos usando documentación o código que pueda adaptarse a las diferentes codificaciones, pero eso es algo que se debió estar haciendo ya de cualquier manera.
La razón por la que aparece el error mencionado arriba es que la codificación por defecto es US-ASCII.
No se por qué usaron US-ASCII en lugar de UTF-8 ¿será por rendimiento?
La solución
Debes indicar la codificación que usas en cada uno de tus archivos.
Agrega una línea como esta al principio de tus archivos (ambas formas funcionan, pero la primera fue agregada por Emacs de manera automática):
1 | # -*- coding: utf-8 -*- |
1 | # encoding: UTF-8 |
Recursos
Puedes obtener más información en: Ruby 1.9′s Three Default Encodings

0 Responses to “Ruby 1.9 — invalid multibyte char (US-ASCII)”