【发布时间】:2013-11-24 18:42:23
【问题描述】:
我有一个允许用户输入字符串的应用程序,我对其进行解析,将其存储在数据库中用于历史记录,并返回一些消息。
在控制器中,这就是我构建消息的方式
@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 吗?
-
你的意思是文件编码吗?是的,它是 UTF-8,但我不确定为什么会有所作为。
-
这篇文章可能对你有帮助 yehudakatz.com/2010/05/05/… ,说实话我没读过它,但它似乎对编码有好处:) 如果你发现有用的东西告诉我
-
使用
force_encoding的想法似乎相当可疑。
标签: ruby-on-rails encoding ruby-on-rails-4