char multibyte inválido (US-ASCII) con Rails y Ruby 1.9


197

Estoy usando Ruby 1.9.1 con Rails 2.3.4 Mi aplicación es manejar el ingreso de texto

Si intento algo como (las comillas internas se ven diferentes)

text = "”“"

Obtuve el siguiente error:

#<SyntaxError: /Users/tammam56/rubydev/favquote/lib/daemons/twitter_quotes_fetch.rb:54: invalid multibyte char (US-ASCII)
/Users/tammam56/rubydev/favquote/lib/daemons/twitter_quotes_fetch.rb:54: invalid multibyte char (US-ASCII)
/Users/tammam56/rubydev/favquote/lib/daemons/twitter_quotes_fetch.rb:54: syntax error, unexpected $end, expecting keyword_end

¿Necesito usar esas comillas ya que los usuarios pueden ingresarlas y tengo que dar cuenta de eso?

¿Algunas ideas?


Si su código no tiene ningún backticks pero está siendo "acusado" de usar backticks, puede haber algunos problemas extraños de espaciado / tabulación / nueva línea en su archivo. Intente publicarlo en un espacio en blanco de StackOverflow, por ejemplo, y SO comenzará a actuar de manera extraña. Elimina los espacios extraños, las pestañas y las nuevas líneas. Nuevamente, simplemente pegar el código en un SO en blanco e intentar formatear el código para la presentación es una forma de darse una pista.
boulder_ruby

Respuestas:


691

¿Has intentado agregar un comentario mágico en el script donde usas caracteres no ASCII? Debería ir encima del guión.

#!/bin/env ruby
# encoding: utf-8

Funcionó para mí como un encanto.


2
Hmm ......... agregó eso en la parte superior del archivo pero aún recibe el mismo mensaje de error. ¿Alguna sugerencia?
Artem Kalinchuk

8
La explicación central se puede encontrar en el artículo @dalyons vinculado: los archivos fuente reciben una codificación ASCII de EE. UU., A menos que usted indique lo contrario. Si coloca cualquier contenido que no sea ASCII en un literal de cadena sin cambiar la codificación de origen, Ruby morirá con ese error. Gracias chicos, finalmente lo conseguí :-)
bass-t

2
#!/bin/env rubyno es necesario a menos que esté ejecutando el script desde la línea de comandos como un ejecutable. La # encodinglínea funciona por sí sola.
gak

10
# encoding: utf-8. Es finales de 2013 y todavía tenemos que jugar este juego. Espera, suena el teléfono ... Era 2033, llamaron para decir que todavía lo tocaban. Bueno, gracias por recordármelo, Jarek Zmudzinski de 2010.
thomax

1
@gotqn - Encuentre el mismo artículo aquí - graysoftinc.com/character-encodings/…
Alok Swain

43

Si desea agregar comentarios mágicos en todos los archivos fuente de un proyecto fácilmente, puede usar la magic_encodinggema

sudo gem install magic_encoding

luego simplemente llame magic_encodingal terminal desde la raíz de su aplicación.


Creo que es importante recordar este tipo de detalles, por lo que no usaría esa gema durante al menos unos meses de escribir la codificación #: utf-8 manualmente.
Marcel Valdez Orozco

agregando 'gem magic_encoding' a gemfile on rails 2.3 y ruby ​​1.9 ayudaron
Elmor

esto no se integra en las pruebas de pepino.
Viaje el

1
@Elmor Nunca debe poner bibliotecas externas en el Gemfile de su proyecto de esa manera. magic_encodinges solo una herramienta de línea de comandos, no una dependencia del proyecto.
Nowaker

17

Solo quiero agregar mi solución:

utilizo diéresis alemanas como ö, ü, ä y obtuve el mismo error.
@Jarek Zmudzinski te acaba de decir cómo funciona, pero aquí está el mío:

Agregue este código a la parte superior de su controlador: # encoding: UTF-8
(por ejemplo, para usar un mensaje flash con diéresis)

ejemplo de mi controlador:

# encoding: UTF-8
class UserController < ApplicationController

Ahora puede usar ö, ä, ü, ß, "", etc.


8

Esas comillas dobles inclinadas no son caracteres ASCII. El mensaje de error es engañoso acerca de que son 'multibyte'.


2
¿Por qué es engañoso? Ellos son caracteres de varios bytes.
Matthew Scharley

44
Porque ASCII no define ninguna codificación de varios bytes. En lo que respecta a ASCII, esos son galimatías, que resultan ser válidos en una codificación relacionada.
Phil Miller el

8

Solo una nota de que a partir de Ruby 2.0 no hay necesidad de agregar # encoding: utf-8. UTF-8 se detecta automáticamente.


8

Eso funcionó para mí:

$ export LC_ALL=en_US.UTF-8
$ export LANG=en_US.UTF-8
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.