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

5
我有一个应用程序,允许用户输入字符串,我对其进行解析,将其存储在数据库中以供历史记录,并返回一些信息。
在控制器中,这是我构建信息的方式:
@messages << name + " was not created" 

在代码中,这是引起程序崩溃的那一行。
<% @messages.each do |msg| %>
  <li> <b><%= msg %></b></li> <--- this line
<% end %>

在这个问题上进行搜索,可以得到几种解决方案和对问题出现的原因的解释。 我已经在多个地方正确处理了编码:
  • 我的应用程序默认将所有内容转换为UTF8。
  • 当我输入中文字符并在控制器中呈现特定标记时,它会显示我键入的内容。
  • 当我呈现上述连接字符串时,它会显示正确的字符串。
  • 数据库设置为UTF-8编码。
  • 其他页面能够正确呈现文本(它们直接从数据库获取并显示文本,没有任何字符串操作)。

如果我在视图中注释掉“此行代码”,问题就会消失,但我不知道哪里出了问题。

如果我按照另一个建议编写以下内容,它就能正常工作:

<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

这也可以运行。

如何正确地连接字符串?


你的视图文件编码是否为UTF-8? - medBouzid
你是指文件编码吗?是的,它是UTF-8,但我不确定为什么会有影响。 - MxLDevs
1
这篇文章可能会对你有所帮助:http://yehudakatz.com/2010/05/05/ruby-1-9-encodings-a-primer-and-the-solution-for-rails/,老实说我没有读过,但它似乎涉及到编码方面的很多好东西 :) 如果你发现了有用的内容,请告诉我。 - medBouzid
请参见此答案https://dev59.com/bk7Sa4cB1Zd3GeqP8f5O?rq=1。 - medBouzid
使用force_encoding的想法似乎相当可疑。 - MxLDevs
你使用的是哪个版本的Ruby? - messanjah
1个回答

2

如何正确地连接字符串?

在所有地方使用#mb_chars似乎可以解决这种问题:

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

并且

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接