使用RSpec和Ruby on Rails的国际字符

时间:2012-07-04 14:30:45

标签: ruby-on-rails ruby testing rspec

我刚刚开始使用RSpec,我在RSpec github repo上复制了非常简单的测试,以确保事情按预期工作:

require 'spec_helper'

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

当我将字符串更改为“Olá”或“Caçamba”之类的问题时,问题就开始了。任何具有特殊字符的字符串。当我这样做时,我收到以下错误:

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

有关如何修复它的任何想法?也许一些配置选项?非常感谢

2 个答案:

答案 0 :(得分:29)

您很可能错过了文件顶部的magic comment

# encoding: UTF-8

如果没有此指令,Ruby会尝试使用默认的US-ASCII编码来解释您的文件,并且失败,因为此字符集不包含áç等符号。

这是James Edward II在Ruby中默认源编码的blog post

答案 1 :(得分:0)

国际字符几乎总是使用US-ASCII范围之外的值,这只是您在键盘上找到的英文字母,数字和一小组符号(如果您使用美国键盘)。带有重音,幻想或非偶数字符的字符(例如表情符号)用多个字节表示,这些字节用于表示US-ASCII。数值到字符的映射是callen和编码。在US-ASCII之后,有ISO-8891-1,它增加了文件的重音(主要是西班牙语,法语,瑞典语等)(例如:é,å,ü等)。之后,您将获得Unicode,其中包括˝,‰,Ó,◊或几乎任何您能用任何语言思考的符号。

Ruby,默认情况下,它具有程序的编码,并且其中的所有字符串都是US-ASCII。您可以使用魔术注释更改整个文件(及其中的所有内容)的编码(请参阅@ KL-7的答案),或者您可以逐个字符串地更改它:

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

Ruby还支持一个名为ASCI 8-bit的虚构编码,它本质上是没有编码的二进制数据。