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

MxL*_*evs 5 encoding ruby-on-rails ruby-on-rails-4

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

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

@messages << name + " was not created" 
Run Code Online (Sandbox Code Playgroud)

在视图中,这是它崩溃的线路

<% @messages.each do |msg| %>
  <li> <b><%= msg %></b></li> <--- this line
<% end %>
Run Code Online (Sandbox Code Playgroud)

对这个问题进行搜索后得到了多种解决方案以及对问题发生原因的解释。我在几个地方正确处理编码:

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

当我在视图中注释掉“这一行”时,问题就消失了,但我不明白它出了什么问题。

如果我按照另一个建议写这个,它就会起作用

<li> <b><%= msg.force_encoding("utf-8") %></b></li>
Run Code Online (Sandbox Code Playgroud)

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

我怀疑问题出在我连接字符串的方式上:

@messages << name + " was not created" 
Run Code Online (Sandbox Code Playgroud)

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

@messages.size.times do |i|
  @messages[i] = @messages[i].force_encoding("UTF-8")
end
Run Code Online (Sandbox Code Playgroud)

这也有效。

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

Eug*_*Zol 2

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

使用#mb_charsEverywhere 似乎可以解决此类问题:

@messages << name.mb_chars + " was not created"
Run Code Online (Sandbox Code Playgroud)

和

<% @messages.each do |msg| %>
  <li><b><%= msg.mb_chars %></b></li>
<% end %>
Run Code Online (Sandbox Code Playgroud)