2

我们为我们的在线商店使用 Rails 3 和 Spree Commerce,并且我们有一个支付提供商,如果发生某些错误,它会在重定向 URL 中返回错误。当发生错误时,我们会将该字符串与 Flash 消息一起呈现给用户。

昨天,有些东西不起作用,支付提供商在重定向 URL 中返回了这个字符串,它应该在一个 flash 消息中呈现给用户:

errormsg=Bitte+versuchen+Sie+es+sp%E4ter+nochmals.

我调试了一下,解码时字符串看起来像这样(例如写入flash[:error]):

Bitte versuchen Sie es sp\xE4ter nochmals.

之后,当 rails 尝试渲染 flash 消息时,会引发错误:

invalid byte sequence in UTF-8

有人可以告诉我,如何解决这个问题?错误应该包含一个 Germanä而不是\xE4. 我尝试设置# encoding: utf-8到控制器和视图的开头,但这没有帮助。

4

1 回答 1

3

'显然,您的支付提供商使用 ISO-8859-1 或类似标准来发送德语变音符号。
由于您的 Rails 应用程序使用 UTF-8,因此您可以转换您的供应商的消息。

假设您将消息存储在变量 msg 中,请使用

utf_msg = params[:errormsg].force_encoding('ISO-8859-1').encode('UTF-8')

您还可以检查生成的编码是否有效:

uft_msg.valid_encoding?

并输出不同的消息以避免错误。

于 2013-08-03T09:16:34.977 回答