Rails 4:不兼容的字符编码:UTF-8和ASCII-8BIT

时间:2013-11-24 18:42:23

标签: ruby-on-rails encoding ruby-on-rails-4

我有一个允许用户输入字符串的应用程序,我解析它,将其存储在数据库中用于历史目的,并返回一些消息。

在控制器中,这是我构建消息的方式

@messages << name + " was not created" 

在视图中,这是它崩溃的行

<% @messages.each do |msg| %>
  <li> <b><%= msg %></b></li> <--- this line
<% end %>

对问题进行搜索后,会出现几种解决方案并解释问题发生的原因。 我在几个地方正确处理编码:

  • 我的应用程序默认情况下会将内容转换为UTF8。
  • 当我输入中文字符并在控制器中呈现特定标记时,它会显示我输入的内容。
  • 当我渲染上面的连接字符串时,它会显示正确的字符串
  • 数据库设置为UTF-8编码
  • 其他页面能够正确呈现文本(它们从数据库中提取并直接显示,而不需要任何字符串操作)

当我在视图中注释掉“this line”时,问题就消失了,但我不明白它有什么问题。

如果我写这个,按照另一个建议,它可以工作

<li> <b><%= msg.force_encoding("utf-8") %></b></li>

但我不喜欢它,因为我不应该“强制”任何编码,理想情况下,所有进入的应该是UTF-8或正确转换为UTF-8,并且视图可以假定它们是渲染是正确的UTF-8。

我怀疑问题是我连接字符串的方式:

@messages << name + " was not created" 

如果我像这样进行强制编码

@messages.size.times do |i|
  @messages[i] = @messages[i].force_encoding("UTF-8")
end

这也有效。

连接字符串的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

  

连接字符串的正确方法是什么?

在任何地方使用#mb_chars似乎都可以解决这类问题:

@messages << name.mb_chars + " was not created"

<% @messages.each do |msg| %>
  <li><b><%= msg.mb_chars %></b></li>
<% end %>