12

我刚刚开始使用 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á")

关于如何解决它的任何想法?也许一些配置选项?非常感谢

4

2 回答 2

29

您很可能在文件顶部遗漏了一条神奇的注释:

# encoding: UTF-8

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

这是 James Edward Gray II 关于 Ruby 中默认源编码的博客文章

于 2012-07-04T14:33:04.987 回答
0

国际字符几乎总是使用 US-ASCII 范围之外的值,这只是您在键盘上找到的英文字母、数字和一小组符号(如果您使用美式键盘)。带有口音、花哨或什至不是字符的字符(例如表情符号)用一个以上的字节表示,这就是用来表示 US-ASCII 的全部内容。数值到字符的映射称为编码。在 US-ASCII 之后,有 ISO-8891-1,它为文件添加了重音符号(主要是西班牙语、法语、瑞典语等)(例如:é、å、ü 等)。之后,您将获得 Unicode,其中包括 ˝、‰、Ó、^、◊ 或几乎任何您能用任何语言想到的符号。

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

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

Ruby 还支持一种称为 ASCI 8 位的虚构编码,它本质上是没有编码的二进制数据。

于 2012-07-04T14:43:31.877 回答