【问题标题】:How can I convert a String with \xf6 chars into a human readable one?如何将带有 \xf6 字符的字符串转换为人类可读的字符串?
【发布时间】:2013-02-21 15:00:59
【问题描述】:

目前我正在开发一个带有 PayPal 结帐的 Rails 应用程序。 PayPal 使用 IPN 消息与我的应用程序通信。

在许多情况下一切正常,但如果有人使用特殊字符,如德语变音符号 (öüäß),我会在字符串中得到 \xf6

如何将其转换为人类可读的字符 'ö'

【问题讨论】:

  • 返回给您的完整字符串(带有\xf6)是什么? (假设它作为字符串返回;否则你是从文件中读取它还是什么?)
  • IPN 是对服务器的 POST 请求。我得到的带有参数的有效载荷。例如,我可以使用 params[:last_name] 获取付款人姓名。在我的情况下,如果 Schöning

标签: ruby ruby-on-rails-3 utf-8 iconv


【解决方案1】:

问题是数据被编码为 Windows-1252,但 ruby​​ 不会自动检测到它。你可以这样哄它:

my_string = "Sch\xF6ning"
my_string.force_encoding('windows-1252').encode('utf-8')
=> "Schöning"

你可以制作一个可重复使用的转换器来帮助你做同样的事情:

ec = Encoding::Converter('windows-1252', 'utf-8')
ec.convert(my_string)
=> "Schöning"

【讨论】:

  • 很好的答案,但 iso-8859-1 是 latin-1。 Windows-1252 是一种不同的编码。
  • @pguardiario:你是对的 - 它是the basis for Windows-1252,但它们并不相同。 Windows-28591 实际上是符合 ISO 规范的页面 - 已更正。
  • @PinnyM:你为什么改变你的答案?你是对的。编码是 windows-1252,你的代码对我很有效。
  • @DimitriRoschkowski: HTTP standard encoding for 'text/*' 是 ISO-8859-1,而不是 Windows-1252。 HTML5 规范通过声明声称使用 ISO-8859-1 的文档实际上应该使用 Windows-1252 来解析,从而使这一点复杂化。给出的答案适用于 ISO-8859-1,也适用于 Windows-1252,大多数情况(包括德语),但不一定适用于所有情况(尤其是法语)。但是,如果您完全确定它使用的是 Windows-1252,那么只需使用“windows-1252”代替它即可。
  • ISO-8859-1 可能是 HTTP 标准编码,但 PayPal 使用的是 Windows-1252。我不知道为什么。在 IPN(即时付款通知)中,编码类型是通知的一部分,其中一个变量表示“charset”=>“windows-1252”
【解决方案2】:

请注意,paypal 端对此进行了设置:

在卖家的 paypal 账户中转到:个人资料 > 我的销售工具 > PayPal 按钮语言编码 > 更多选项

【讨论】:

    猜你喜欢
    • 2012-03-31
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多