Ruby 1.9 — invalid multibyte char (US-ASCII)

ruby.jpg

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

Artículos relacionados:

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


  • No Comments

Leave a Reply

Lobos en línea

De pata de lobo

Campo de trigo en una tarde nublada.
Neuenkirchen, Deutschland. [Mayo 2007] Atardecer entre matorrales 1/3.
Desierto de Real de Catorce, San Luis Potosí, México. [Febrero 2007] Horizonte en el desierto 1/3.
Desierto de Real de Catorce, San Luis Potosí, México. [Febrero 2007] Puesta de sol entre matorrales 1/2.
Desierto de Real de Catorce, San Luis Potosí, México. [Diciembre 2007] Atardecer entre matorrales 3/3.
Desierto de Real de Catorce, San Luis Potosí, México. [Febrero 2007] Horizonte en el desierto 2/3.
Desierto de Real de Catorce, San Luis Potosí, México. [Febrero 2007]

Qué estoy haciendo...

Posting tweet...

Powered by Twitter Tools

Mapa de visitas

Mira…

Calendario

julio 2009
L M X J V S D
« jun   ago »
 12345
6789101112
13141516171819
20212223242526
2728293031  

FireStats icon Con la potencia de FireStats