【问题标题】:HTML encode UTF-8 string gets mangled into latin1HTML 编码 UTF-8 字符串被修改为 latin1
【发布时间】:2010-04-01 02:12:52
【问题描述】:

我正在解析我的 nginx 日志,并且我想从 HTTP_REFERER 字符串中发现一些详细信息,例如,用于查找网站的查询字符串。一位用户输入了“México”,在日志中被编码为“query=M%E9xico”。

通过Rack::Utils.parse_query('query=M%E9xico') 传递它,你会得到一个哈希,{"query" => "M?xico"}

当您将“M?exico”填充到 Postgres(但不是更宽容的 SQLite)中时,它会呕吐,因为字符串不是正确的 UTF-8。查看http://rack.rubyforge.org/doc/Rack/Utils.html#M000324,unescape 正在打包一个十六进制字符串。

如何将字符串转换回 UTF-8,或者我可以让 parse_query 首先返回 UTF-8。

【问题讨论】:

  • 日志中的信息已损坏:%E9 表明它不是 UTF-8。如果不假设初始字符集是什么,您就无法转换它。

标签: ruby-on-rails postgresql rack


【解决方案1】:

unescape 将解码 URL 编码:

Rack::Utils.parse_query(URI.unescape('query=M%E9xico'))

或者

Rack::Utils.parse_query(Utils.unescape('query=M%E9xico'))

【讨论】:

    【解决方案2】:

    这里的问题发生在您掌握数据之前。如果可以的话,您需要在上游解决问题,如果不能,那么我的建议是找出编码并在输入时将其转换或使用 Ruby 中的转换库(例如 iconv)。

    不过,问题不在于 PostgreSQL。

    【讨论】:

      猜你喜欢
      • 2012-03-24
      • 2017-01-19
      • 2015-11-12
      • 1970-01-01
      • 2011-08-09
      • 2020-09-15
      • 2015-04-14
      • 2014-01-18
      相关资源
      最近更新 更多