【问题标题】:International chars using RSpec with Ruby on Rails使用 RSpec 和 Ruby on Rails 的国际字符
【发布时间】:2012-07-04 14:30:44
【问题描述】:

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

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

【问题讨论】:

  • 您的文件保存为 ASCII 还是 UTF-8?

标签: ruby-on-rails ruby testing rspec


【解决方案1】:

您很可能在文件顶部缺少magic comment

# encoding: UTF-8

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

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

【讨论】:

  • 顺便说一句,有一个不错的 gem 叫做 magic_encoding 可以帮助您快速将此注释添加到 .rb 文件中。
  • 非常感谢 KL-7,修复了它 :) magic_encoding gem 也很有帮助,谢谢@naliwajek
  • 那.. 出乎意料地真的很容易。谢谢!
【解决方案2】:

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

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

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

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

【讨论】:

  • 我认为force_encoding 可能有助于稍后处理字符串,但它不会帮助解释器解析原始字符串文字。我对吗?这是一个相关的article Ruby 中的字符串编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多