Ruby on rails 3 Rails utf-8问题

Ruby on rails 3 Rails utf-8问题,ruby-on-rails-3,character-encoding,Ruby On Rails 3,Character Encoding,我不熟悉ruby(和rails),在字符串中使用瑞典语字母时遇到som问题。在我的操作中,创建如下实例变量: @title = "Välkommen" 我得到以下错误: invalid multibyte char (US-ASCII) syntax error, unexpected $end, expecting keyword_end @title = "Välkommen" ^ 发生了什么事 编辑:如果我添加: # coding: utf-8 在我的控制器

我不熟悉ruby(和rails),在字符串中使用瑞典语字母时遇到som问题。在我的操作中,创建如下实例变量:

@title = "Välkommen"
我得到以下错误:

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

编辑:如果我添加:

# coding: utf-8

在我的控制器顶部,它工作。这是为什么?我该如何解决这个“问题”?

参见乔尔·斯波尔斯基的文章

请简要引用回答此问题的部分

关于编码的一个最重要的事实 如果你完全忘记了我刚才解释的一切,请记住 一个极其重要的事实。有一个字符串是没有意义的 不知道它使用什么编码。你不能再坚持你的观点了 把头埋在沙子里,假装“纯”文本是ASCII码

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

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

ruby 1.9中的“神奇注释”(Rails 3基于此)告诉解释器预期的编码。这很重要,因为在Ruby1.9中,每个字符串都有一个编码。在1.9之前,每个字符串都只是一个字节序列

詹姆斯·格雷(James Gray)关于Ruby和Unicode的一系列博客文章很好地描述了这个问题。与您的问题完全相关的是(但请查看其他问题,因为它们非常好)

文章的要点是:

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


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

  • 确保项目中的每个文件都基于utf-8(如果需要) 如果使用rad rails,这很容易实现:标记您的项目, 选择属性,在“文本文件编码”框中选择“其他: utf-8“
  • 确保再次在文件中输入奇怪的“å,ä,ö”字符 或者你会得到一个mysql错误,因为它会将你的“å,ä,ö”更改为 “正方形”(未知字符)

  • 在每个服务器环境的databases.yml集合中(在此 示例“使用mysql进行开发”)

  • 在应用程序控制器中设置before筛选器 (application.rb):

    class ApplicationController
  • 确保在mysql中将编码设置为utf-8(我只使用了 mysql..所以我不知道其他数据库)的每个表。如果你 使用mySQL管理员您可以这样做:编辑表格,按 “表选项”选项卡,将字符集更改为“utf8”,并将排序规则更改为 “utf8\u常规\u ci” (科特西:康巴桑)


  • 为每个请求设置
    内容类型
    标题是一个坏主意,因为某些响应可能不是
    文本/html
    格式。在每个请求上设置该标题会产生一个良好的默认值,其他请求可以覆盖该默认值+1对于Rails 3+,使用
    response.headers['Content-Type']
    而不是
    @headers[“Content-Type”]
    Potential Gotcha:Rails 3中
    application.rb
    的这一行:
    config.encoding=“utf-8”
    仅适用于模板。
    development:
       adapter: mysql
       encoding: utf8
    
    class ApplicationController < ActionController::Base
     before_filter :set_charset
     def set_charset
      @headers["Content-Type"] = "text/html; charset=utf-8"
     end
    end