Rails和Ruby 1.9中出现无效的多字节字符(US-ASCII)

200
我使用Ruby 1.9.1和Rails 2.3.4。我的应用程序需要处理文本输入。
如果我尝试像这样做(引号内的样子不同):
text = "”“"

我收到以下错误:

#<SyntaxError: /Users/tammam56/rubydev/favquote/lib/daemons/twitter_quotes_fetch.rb:54: invalid multibyte char (US-ASCII)
/Users/tammam56/rubydev/favquote/lib/daemons/twitter_quotes_fetch.rb:54: invalid multibyte char (US-ASCII)
/Users/tammam56/rubydev/favquote/lib/daemons/twitter_quotes_fetch.rb:54: syntax error, unexpected $end, expecting keyword_end

我需要使用引号因为用户可能会输入它们,我必须考虑到这一点?

有什么想法吗?


如果你的代码中没有使用反引号,但是却被“指责”使用了反引号,那么可能是文件中存在一些奇怪的空格、制表符或换行符问题。尝试将其粘贴到 StackOverflow 的空白处进行示例展示,这时 SO 将开始表现异常。移除奇怪的空格、制表符和换行符。同样,只需将代码粘贴到 SO 空白处并尝试格式化代码以供展示,这是给自己一个提示的方法之一。 - boulder_ruby
6个回答

690

你尝试在使用非ASCII字符的脚本中添加魔法注释了吗?它应该放在脚本顶部。

#!/bin/env ruby
# encoding: utf-8

它对我起了魔法般的作用。


2
嗯………把它添加到文件顶部,但仍然收到相同的错误信息。有任何建议吗? - Artem Kalinchuk
8
核心解释可以在@dalyons链接的文章中找到:源文件默认采用US-ASCII编码,除非你另作说明。如果你在字符串字面量中放置任何非ASCII内容且没有改变源编码,Ruby将会报错。感谢大家,我终于明白了 :-) - bass-t
2
除非您将脚本作为可执行文件从命令行运行,否则#!/bin/env ruby不是必需的。 # encoding行可以单独使用。 - gak
10
“# encoding: utf-8”。时光来到了2013年末,我们仍需要玩这个游戏。等等,电话响了……是2033年的人打来,他们说他们仍在玩这个游戏。哦,好吧,感谢2010年的Jarek Zmudzinski提醒我。 - thomax
1
@gotqn - 请在这里找到相同的文章 - http://graysoftinc.com/character-encodings/ruby-19s-three-default-encodings - Alok Swain
显示剩余5条评论

42
如果你想要在一个项目的所有源文件上轻松添加魔法注释,可以使用 magic_encoding gem。
sudo gem install magic_encoding

那么只需在应用程序的根目录下,在终端中调用magic_encoding即可。


我认为记住这种细节很重要,所以在手动编写# encoding: utf-8的几个月内,我不会使用那个gem。 - Marcel Valdez Orozco
将'gem magic_encoding'添加到Rails 2.3和Ruby 1.9的Gemfile中有所帮助。 - Elmor
这不适用于Cucumber测试。 - Trip
1
@Elmor,你不应该像那样将外部库放入项目的Gemfile中。magic_encoding只是一个命令行工具,而不是项目依赖项。 - Nowaker

18

我只想添加我的解决方案:

我像使用 ö、ü、ä 这样的德语变音符并且遇到了相同的错误。
@Jarek Zmudzinski 告诉了你如何解决,但这是我的解决方案:

将此代码添加到您的控制器顶部:# encoding: UTF-8
(例如,用于在变音符下使用 flash 消息)

我的控制器示例:

# encoding: UTF-8
class UserController < ApplicationController

现在你可以使用 ö、ä、ü、ß、"" 等字符。


12

那对我起了作用:

$ export LC_ALL=en_US.UTF-8
$ export LANG=en_US.UTF-8

8

那些倾斜的双引号不是ASCII字符。错误信息对它们被称为“多字节”是误导性的。


2
为什么这是误导性的?它们确实是多字节字符。 - Matthew Scharley
4
因为 ASCII 并未定义任何多字节编码方式。对于 ASCII 来说,这些都是乱码,在相关编码中被认为是有效的。 - Phil Miller

8

需要注意的是,从Ruby 2.0版本开始,不需要再添加# encoding: utf-8了。UTF-8会被自动检测到。


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