【问题标题】:Rails 4: incompatible character encodings: UTF-8 and ASCII-8BITRails 4:不兼容的字符编码:UTF-8 和 ASCII-8BIT
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-05-26
    • 2011-12-14
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2012-07-12
    • 2011-10-17
    • 2016-04-27
    相关资源
    最近更新 更多