我在那里,我是ruby(和rails)的新手,在字符串中使用瑞典字母时遇到了问题。在我的动作中,创建一个像这样的实例变量:
@title = "Välkommen"
我收到以下错误:
invalid multibyte char (US-ASCII)
syntax error, unexpected $end, expecting keyword_end
@title = "Välkommen"
^
发生了什么?
编辑: 如果我添加:
# coding: utf-8
在我的控制器的顶部它工作。为什么这样,我怎么能解决这个“问题”?
见Joel spolsky的文章“绝对最低每个软件开发人员绝对必须知道Unicode和字符集(没有借口!)”。
引用简洁地回答这个问题的部分
关于编码的最重要事实
如果你完全忘记我刚才解释的一切,请记住
一个非常重要的事实。 拥有一个字符串是没有意义的
不知道它使用什么编码。 你不能再坚持你的了
在沙滩上,并假装“普通”文本是ASCII。
这就是为什么你必须告诉ruby你的文件中使用了什么编码。由于编码没有标记在与您的文件关联的某种元数据中,因此某些软件会假定为ASCII,直到它知道更好。 Ruby 1.9可能会这样做直到你的注释停止,并重新开始读取文件,现在将其解码为utf-8。
显然,如果您对ruby文件使用了一些其他Unicode编码或更多本地编码,则需要更改注释以指示正确的编码。
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编码,除非您另有说明。
有几个地方可能导致utf-8编码问题。
但一些技巧是解决这个问题:
- 确保项目中的每个文件都是基于utf-8的(如果你
使用rad轨道,这很容易实现:标记你的项目,
选择属性,在“文本文件编码”框中,选择“其他:
UTF-8" )
务必再次在文件中添加奇怪的“å,ä,ö”字符
或者你会得到一个mysql错误,因为它会将你的“å,ä,ö”改为a
“方”(未知字符)
在您的databases.yml中为每个服务器环境设置(在此
示例“开发”与mysql)
development:
adapter: mysql
encoding: utf8
在应用程序控制器中设置前置过滤器
(application.rb中):
class ApplicationController < ActionController::Base
before_filter :set_charset
def set_charset
@headers["Content-Type"] = "text/html; charset=utf-8"
end
end
一定要在你的mysql中将编码设置为utf-8(我只使用过
每个表都有mysql ..所以我不知道其他数据库。如果你
使用mySQL Administrator你可以这样做:编辑表,按下
“表格选项”选项卡,将字符集更改为“utf8”并整理到
“utf8_general_ci”
(Courtsey:kombatsanta)