2012-07-04 10 views
12

yo acabamos de comenzar a utilizar RSpec y yo copiado la prueba muy simple en el repositorio GitHub RSpec sólo para asegurarse de que todo funciona como se espera:caracteres internacionales utilizando RSpec con Ruby on Rails

require 'spec_helper' 

describe 'Home Page' do 
    it "Welcomes the user" do 
    visit '/products' 
    page.should have_content("Welcome") 
    end 
end 

Los problemas comienzan cuando Cambio la cuerda a algo como "Olá" o "Caçamba". Cualquier cadena con un carácter especial. Cuando lo hago, aparece el siguiente error:

invalid multibyte char (US-ASCII) (SyntaxError) 
invalid multibyte char (US-ASCII) 
syntax error, unexpected $end, expecting ')' 
page.should have_content("Olá") 

¿Alguna idea sobre cómo solucionarlo? Tal vez alguna opción de configuración? Muchas gracias

+0

¿Su archivo se guarda como ASCII o UTF-8? – LanguagesNamedAfterCofee

+0

Los archivos se guardaron como UTF-8 – thyagx

Respuesta

28

Lo más probable es que se está perdiendo una magic comment en la parte superior de su archivo:

# encoding: UTF-8 

Sin esta directiva Rubí trata de interpretar su archivo con la codificación predeterminada US-ASCII y fracasa ya que este carácter el conjunto no incluye símbolos como á o ç.

Aquí hay blog post en la codificación de fuente predeterminada en Ruby por James Edward Gray II.

+2

A propósito, hay una joya llamada [magic_encoding] (https://github.com/m-ryan/magic_encoding/) que puede ayudarlo a agregar rápidamente este comentario a los archivos .rb. –

+0

Muchas gracias KL-7, que lo arregla :) La joya magic_encoding también es muy útil, gracias @naliwajek – thyagx

+0

Eso ... fue muy fácil. ¡Gracias! – Trip

0

Los caracteres internacionales casi siempre usan valores fuera del rango de US-ASCII, que es solo el alfabeto inglés, números y un pequeño conjunto de símbolos que puede encontrar en su teclado (si usa un teclado estadounidense). Los caracteres con acentos, fantasía o que no son ni siquiera caracteres (por ejemplo, emoticones) están representados en más de un byte, que es todo lo que se usa para representar US-ASCII. Las asignaciones de valor numérico a caracteres son callen una codificación. Después de US-ASCII, está ISO-8891-1, que agrega acentos al archivo (principalmente español, francés, sueco, etc.) (p. Ej .: é, å, ü, etc.). Después de eso, obtienes Unicode, que incluye cosas como ˝, ‰, Ó, ◊, o casi cualquier símbolo que se te ocurra en cualquier lenguaje.

Ruby, de forma predeterminada, tiene la codificación de un programa y todas las cadenas en él como US-ASCII. Usted puede cambiar la codificación de todo el archivo (y todo en él) con el comentario de la magia (ver @ respuesta de KL-7) o se puede cambiar de una cuerda por bases cadena:

"Olé".force_encoding("ISO-8891-1") 

Rubí también soporta una codificación imaginaria llamada ASCI de 8 bits, que es esencialmente datos binarios sin codificación.

+1

Creo que 'force_encoding' podría ayudar a trabajar con la cadena más tarde, pero no ayudará al intérprete a analizar el literal original de la cadena. ¿Estoy en lo cierto? Aquí hay un [artículo] relacionado (http://blog.grayproductions.net/articles/ruby_19s_string) sobre la codificación de cadenas en Ruby. –

+0

@ KL-7: Sí. Tienes razón. Necesitas un comentario mágico – Linuxios