问题 Rails utf-8问题


我在那里,我是ruby(和rails)的新手,在字符串中使用瑞典字母时遇到了问题。在我的动作中,创建一个像这样的实例变量:

@title = "Välkommen"

我收到以下错误:

invalid multibyte char (US-ASCII)
syntax error, unexpected $end, expecting keyword_end
@title = "Välkommen"
             ^

发生了什么?

编辑: 如果我添加:

# coding: utf-8

在我的控制器的顶部它工作。为什么这样,我怎么能解决这个“问题”?


5536
2017-08-20 18:40


起源

潜在的问题:来自这条线 application.rb 在Rails 3中: config.encoding = "utf-8" 仅适用于模板。 - David J.


答案:


见Joel spolsky的文章“绝对最低每个软件开发人员绝对必须知道Unicode和字符集(没有借口!)”。

引用简洁地回答这个问题的部分

关于编码的最重要事实

如果你完全忘记我刚才解释的一切,请记住   一个非常重要的事实。 拥有一个字符串是没有意义的   不知道它使用什么编码。 你不能再坚持你的了   在沙滩上,并假装“普通”文本是ASCII。

这就是为什么你必须告诉ruby你的文件中使用了什么编码。由于编码没有标记在与您的文件关联的某种元数据中,因此某些软件会假定为ASCII,直到它知道更好。 Ruby 1.9可能会这样做直到你的注释停止,并重新开始读取文件,现在将其解码为utf-8。

显然,如果您对ruby文件使用了一些其他Unicode编码或更多本地编码,则需要更改注释以指示正确的编码。


11
2017-08-20 18:45



啊,现在我知道了,谢谢! - sandelius
我绝对建议你阅读整篇文章。 - Flame


Ruby 1.9中的“魔术评论”(Rails 3所基于的)告诉解释器期望的编码。这很重要,因为在Ruby 1.9中,每个字符串都有一个编码。在1.9之前,每个字符串只是一个字节序列。

关于这个问题的一个很好的描述是James Gray关于Ruby和Unicode的一系列博客文章。与您的问题完全相关的那个是 http://blog.grayproductions.net/articles/ruby_19s_three_default_encodings (但看到其他人,因为他们非常好)。

文章的重要内容:

第一个是源编码的主要规则:源文件接收US-ASCII编码,除非您另有说明。


4
2017-08-20 18:49





有几个地方可能导致utf-8编码问题。 但一些技巧是解决这个问题:

  1. 确保项目中的每个文件都是基于utf-8的(如果你 使用rad轨道,这很容易实现:标记你的项目, 选择属性,在“文本文件编码”框中,选择“其他: UTF-8" )

务必再次在文件中添加奇怪的“å,ä,ö”字符 或者你会得到一个mysql错误,因为它会将你的“å,ä,ö”改为a “方”(未知字符)

  1. 在您的databases.yml中为每个服务器环境设置(在此 示例“开发”与mysql)

    development:
       adapter: mysql
       encoding: utf8
    
  2. 在应用程序控制器中设置前置过滤器 (application.rb中):

    class ApplicationController < ActionController::Base
     before_filter :set_charset
     def set_charset
      @headers["Content-Type"] = "text/html; charset=utf-8"
     end
    end
    
  3. 一定要在你的mysql中将编码设置为utf-8(我只使用过 每个表都有mysql ..所以我不知道其他数据库。如果你 使用mySQL Administrator你可以这样做:编辑表,按下 “表格选项”选项卡,将字符集更改为“utf8”并整理到 “utf8_general_ci” (Courtsey:kombatsanta)


0
2017-08-21 13:04



设置 Content-Type 每个请求的标题都是一个坏主意,因为某些响应可能采用的格式不是 text/html。 - fullsailor
在每个请求上设置它会产生一个很好的默认值,其他请求可以覆盖。 +1 - Paul Lynch
对于Rails 3+,请使用 response.headers['Content-Type'] 代替 @headers["Content-Type"] - clarif