ruby - 确定 Ruby 1.9.3 中的字符编码

标签 ruby ruby-on-rails-3 character-encoding

我的 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” header 。该页面还包含适当的元标记:'meta http-equiv="content-type"content="text/html;charset=UTF-8"'

不确定是否有另一种方法可以告诉客户端使用哪些编码?

最佳答案

字符 ç 在 URL 中被编码为 %E7。这就是 ISO-8859-1 编码 ç 的方式。 ISO-8859-1 字符集表示具有单个字节的字符。表示ç的字节可以用十六进制表示为E7。

在 Unicode 中,ç 的代码点为 U+00E7。与 ISO-8859-1 不同,其中代码点 (E7) 与其编码相同(十六进制的 E7),Unicode 具有多种编码方案,例如 UTF-8、UTF-16 和 UTF-32。 UTF-8 将 U+00E7 (ç) 编码为两个字节 - C3 A7。

参见 here用于编码 ç 的其他方式。

至于为什么 ISO-8859-1 中的 U+00E7 和 E7 都使用“E7”,Unicode 中的前 256 个代码点与 ISO-8859-1 相同.

如果此 URL 是 UTF-8,则 ç 将被编码为 %C3%A7。我(非常有限)对RFC2616的理解是 URL 的默认编码是(当前)ISO-8859-1。因此,这很可能是 ISO-8859-1 编码的 URL。这意味着,最好的方法可能是检查编码是否有效,如果不是,则假设它是 ISO-8859-1 并将其转码为 UTF-8:

unless query.valid_encoding?
    query.encode!("UTF-8", "ISO-8859-1", :invalid => :replace, :undef => :replace, :replace => "")
end

这是 IRB 中的过程(加上最后的转义是为了好玩)

a = CGI.unescape("%E7")
=> "\xE7"
a.encoding
=> #<Encoding:UTF-8>
a.valid_encoding?
=> false
b = a.encode("UTF-8", "ISO-8859-1")    # From ISO-8859-1 -> UTF-8
=> "ç"
b.encoding
=> #<Encoding:UTF-8>
CGI.escape(b)
=> "%C3%A7"

关于ruby - 确定 Ruby 1.9.3 中的字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9799728/

相关文章:

ruby-on-rails - Heroku 安装 sqlite3 即使它不是依赖项

java.lang.IllegalArgumentException : Non-positive maxBytesPerChar 异常

ruby-on-rails - "LoadError: no such file to load"需要 gem 时

ruby-on-rails - 如何修复 ngrok 权限被拒绝?

ruby-on-rails - Rails 简单模型属性未保存到数据库

ruby-on-rails - rails : rake db:create:all fails to connect to PostgreSQL database

php - 处理特殊字符(html_entity_decode、inov 等)

java - 从编译到运行,Java String编码到底是如何工作的

ruby - 以编程方式在 Ruby 中获取桌面的屏幕截图?

c - (U) Ruby 扩展 : rb_gc_mark() and instance variables