RSpec在Ruby on Rails中使用国际字符

12

我刚开始使用 RSpec,只是为了确保一切都按预期工作,复制了 RSpec GitHub 存储库上非常简单的测试:

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á")

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


你的文件保存为 ASCII 还是 UTF-8? - LanguagesNamedAfterCofee
2个回答

29

很可能您在文件顶部缺少一个魔法注释

# encoding: UTF-8

如果没有这个指令,Ruby会尝试使用默认的US-ASCII编码来解释你的文件。但由于该字符集不包含像áç这样的符号,所以会出现错误。

James Edward Gray II撰写了一篇关于Ruby默认源代码编码的博客文章


2
顺便提一下,有一个不错的宝石叫做magic_encoding,可以帮助您快速将此注释添加到.rb文件中。 - Jakub Naliwajek
非常感谢KL-7,问题已经解决了 :) magic_encoding宝石也非常有用,感谢@naliwajek - avlnx
那..真的出乎意料的容易。谢谢! - Trip

0

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

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

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

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


1
我认为 force_encoding 可能有助于以后处理字符串,但它无法帮助解释器解析原始字符串字面量。我是对的吗?这里有一篇关于 Ruby 中字符串编码的相关文章:http://blog.grayproductions.net/articles/ruby_19s_string。 - KL-7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接