【问题标题】:invalid multibyte char (US-ASCII) with Rails and Ruby 1.9Rails 和 Ruby 1.9 中的无效多字节字符(US-ASCII)
【发布时间】:2010-12-16 22:12:51
【问题描述】:

我正在使用 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 空白中并尝试格式化代码以进行演示是给自己提示的一种方法。

标签: ruby-on-rails ruby-1.9


【解决方案1】:

您是否尝试在使用非 ASCII 字符的脚本中添加魔术注释?它应该在脚本之上。

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

它对我很有用。

【讨论】:

  • 嗯............将其添加到文件顶部,但仍然收到相同的错误消息。有什么建议吗?
  • 中心解释可以在@dalyons 链接的文章中找到:源文件接收US-ASCII 编码,除非您另有说明。如果您在字符串文字中放置任何非 ASCII 内容而不更改源编码,Ruby 将因该错误而死。 谢谢大家,我终于明白了 :-)
  • #!/bin/env ruby 不是必需的,除非您从命令行将脚本作为可执行文件运行。 # encoding 行独立工作。
  • # encoding: utf-8。现在是 2013 年末,我们还得玩这个游戏。等等,电话响了……2033年了,他们打电话说还在玩。哦,好吧,谢谢你提醒我,2010 年的 Jarek Zmudzinski。
  • @gotqn - 请在此处找到相同的文章 - graysoftinc.com/character-encodings/…
【解决方案2】:

如果你想在一个项目的所有源文件上轻松添加魔法 cmets,你可以使用magic_encoding gem

sudo gem install magic_encoding

然后只需在终端中从应用的根目录调用magic_encoding。

【讨论】:

  • 我认为记住这些细节很重要,所以至少几个月我不会使用那个 gem 手动编写 # encoding: utf-8。
  • 将“gem magic_encoding”添加到 rails 2.3 和 ruby​​ 1.9 上的 gemfile 有帮助
  • 这不会集成到黄瓜测试中。
  • @Elmor 你永远不应该像那样将外部库放到项目的 Gemfile 中。 magic_encoding 只是一个命令行工具,不是项目依赖。
【解决方案3】:

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

我使用像ö,ü,ä这样的德语变音符号并得到了同样的错误。
@Jarek Zmudzinski 刚刚告诉你它是如何工作的,但这是我的:

将此代码添加到控制器顶部:# encoding: UTF-8
(例如使用带有变音符号的 Flash 消息)

我的控制器示例:

# encoding: UTF-8
class UserController < ApplicationController

现在您可以使用ö、ä、ü、ß、“”等。

【讨论】:

    【解决方案4】:

    这对我有用:

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

    【讨论】:

      【解决方案5】:

      那些倾斜的双引号不是 ASCII 字符。错误消息误导他们是“多字节”。

      【讨论】:

      • 为什么会产生误导?它们是多字节字符。
      • 因为 ASCII 没有定义任何多字节编码。至于ASCII,那些都是胡言乱语,恰好在相关编码中有效。
      【解决方案6】:

      请注意,从 Ruby 2.0 开始,无需添加 # encoding: utf-8。自动检测 UTF-8。

      【讨论】:

        猜你喜欢
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        • 2011-04-24
        • 1970-01-01
        • 1970-01-01
        • 2011-03-31
        • 1970-01-01
        • 2011-07-25
        相关资源
        最近更新 更多