【发布时间】:2012-04-05 16:23:41
【问题描述】:
我的 Rails 3.2.2 / Ruby 1.9.3 应用程序获取搜索请求,例如:
http://booko.com.au/books/search?q=Fran%E7ois+Vergniolle+de+Chantal
Ruby / Rails 接受此查询并对其进行解码 - 但假定它是 UTF-8。在某些时候我得到一个:
invalid byte sequence in UTF-8
app/models/product.rb:694:in `upcase'
我认为它正在做这样的事情:
q="Fran%E7ois+Vergniolle+de+Chantal"
=> "Fran%E7ois+Vergniolle+de+Chantal"
CGI.unescape( q )
=> "Fran\xE7ois Vergniolle de Chantal"
CGI.unescape( q ).encoding.name
=> "UTF-8"
CGI.unescape( q ).valid_encoding?
=> false
处理这个问题的正确方法是什么?我想将其转码为正确的编码 - 但如何确定当前编码?我目前正在做的只是假设它是 LATIN1:
q.encode!("ISO-8859-1", "UTF-8", :invalid => :replace, :undef => :replace, :replace => "")
或者做一些我在某处博客上找到的事情:
q = q.unpack('C*').pack('U*')
处理这个问题的正确方法是什么?
编辑 服务器正确地向客户端发送“Content-Type: text/html; charset=utf-8”标头。该页面还包含适当的元标记:'meta http-equiv="content-type" content="text/html;charset=UTF-8"'
不确定是否有其他方法可以告诉客户端使用哪种编码?
【问题讨论】:
-
如果在
app/models/product.rb的顶部写上# coding: UTF-8会怎样。我认为它应该解决这个错误。您对这个解决方案满意吗? -
@ck3g,不,这里不是文件编码。
-
您必须使用某种字典才能确定正确的编码,因为相同的字节
0xE7可能(并且确实是)在 Latin1 以外的编码中是有效字符。跨度> -
@ck3g 数据来自网络请求,因此无济于事。应用程序已经认为它是 UTF-8,而实际上不是。
-
@MladenJablanović 是的 - 这将是一个解决方案。有这样的字典吗?由于 0xE7 存在于多种编码中,因此您希望按我猜最常见的方式进行排序 - 除非有多个字符来缩小选择范围。
标签: ruby ruby-on-rails-3 character-encoding