动作控制器:不兼容的字符编码:ASCII-8BIT和UTF-8?

时间:2013-01-22 20:08:29

标签: ruby ruby-on-rails-3 encoding utf-8

我有一个文本文件,里面有一些®(注册商标)符号。该文件是UTF-8。

我正在尝试导入此文件并使用Rails 3填充MySQL数据库。数据库似乎设置正确以采用UTF-8

+-------------+--------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
| Field       | Type         | Collation       | Null | Key | Default | Extra          | Privileges                      | Comment |
+-------------+--------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
| id          | int(11)      | NULL            | NO   | PRI | NULL    | auto_increment | select,insert,update,references |         |
| user_id     | int(11)      | NULL            | YES  | MUL | NULL    |                | select,insert,update,references |         |
| title       | varchar(255) | utf8_general_ci | YES  |     | NULL    |                | select,insert,update,references |         |
| translation | text         | utf8_general_ci | YES  |     | NULL    |                | select,insert,update,references |         |
| created_at  | datetime     | NULL            | NO   |     | NULL    |                | select,insert,update,references |         |
| updated_at  | datetime     | NULL            | NO   |     | NULL    |                | select,insert,update,references |         |
+-------------+--------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+

然而,当我尝试这样做时:

trans_file = params[:descriptions] #coming from file_field_tag
trans = trans_file.read.split("\r\n")
trans.each do |tran|
  ttl = ''
  desc = ''
  tran.split(']=').each do |title|
    if title =~ /\[/ #it's the title
      ttl = title.sub('[','')
    else
      desc = title.gsub('FFF', "\r\n")
    end
  end
  @current_user.cd_translations.build(title: ttl, translation: desc).save

我收到错误“操作控制器:不兼容的字符编码:ASCII-8BIT和UTF-8”。

我在我的application.rb文件中使用utf-8编码,我正在使用mysql2 gem。

如果我删除注册商标字符,则错误消失。但它并不是一个真正的选择,可以将它从传入的文本中删除。

我在这里尝试了解决方案:https://stackoverflow.com/a/5215676/102372,但这没有任何区别。

堆栈追踪:

app/controllers/users_controller.rb:28:in `block in update_cd_translations'
app/controllers/users_controller.rb:15:in `each'
app/controllers/users_controller.rb:15:in `update_cd_translations'
config/initializers/quiet_assets.rb:7:in `call_with_quiet_assets'

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

看来ruby认为上传文件的编码是ascii-8bit(也就是二进制)。

如果您知道文件的编码,则可以使用force_encoding!更改字符串的编码(不进行转码)。如果您不总是确定文件的编码,可以使用charguess gem来猜测它。

答案 1 :(得分:0)

尝试添加

# -*- encoding : utf-8 -*-

在每个文件的开头,包含在整个过程中