【问题标题】:Postgres invalid byte sequence for encoding "UTF8": 0xc3 0x2fPostgres 编码“UTF8”的无效字节序列:0xc3 0x2f
【发布时间】:2020-10-19 17:55:36
【问题描述】:

我使用支付 API,它返回一些 XML。对于日志记录,我想将 API 响应保存在我的数据库中。

API 中的一个词是“manhã”,但 API 返回“manh�”。 á ou ç 等其他字符被正确返回,我猜这是 API 中的一些错误。

但是当我试图将它保存在我的数据库中时,我得到:

Postgres invalid byte sequence for encoding "UTF8": 0xc3 0x2f

我该如何解决这个问题?

我尝试过类似

response.encode("UTF-8")force_encode 但我得到的只是:

Encoding::UndefinedConversionError ("\xC3" from ASCII-8BIT to UTF-8)

我需要删除这个错误的字符或以某种方式对其进行转换。

【问题讨论】:

  • 您确定“支付 API”完全为您提供 UTF-8 编码吗?
  • @AmigoJack api 返回 ISO-8859-1 格式的 XML。我的 rails 表字段是一个正常的“字符变化”。我有其他返回 UTF-8 的 API,我需要将它们全部存储在同一列中。所以我需要以某种方式转换 API 响应,以便能够将其保存在数据库中。
  • XML 开头是这样的:""
  • 应该很明显:ISO-8859-1UTF-8 是不同的编码 - 您必须将一个转换为另一个,而不是通过未处理的方式传递它。

标签: ruby-on-rails postgresql utf-8


【解决方案1】:

你在正确的轨道上 - 你应该能够使用 encode 方法解决问题 - 当知道源编码时,你应该能够简单地使用:

response.encode(‘UTF-8’, ‘ISO-8859-1’)

有时源编码中存在无效字符,为了避免异常,您可以指导 ruby​​ 如何处理它们:

# This will transcode the string to UTF-8 and replace any invalid/undefined characters with ‘’ (empty string)
response.encode(‘UTF-8’, 'ISO-8859-1', invalid: :replace, undef: :replace, replace: ‘’)

这一切都在Ruby docs for String 中列出 - 检查出来!

----

请注意,许多人错误地认为force_encode 会以某种方式解决编码问题。 force_encode 只是将字符串标记为指定的编码 - 它会 not 转码并替换/删除无效字符。在编码之间进行转换时,必须进行转码,以便一个字符集中的字符在另一个字符集中正确表示。

正如评论部分所指出的,如果您使用:response.force_encoding('ISO-8859-1').encode('UTF-8')(相当于上面使用encode 的第一个示例),则可以使用force_encoding 对您的字符串进行转码。

【讨论】:

  • 源编码是已知的并且它没有无效的序列 - 既不需要“丢弃”,也不需要强制某些东西。只需转换它并让异常发生,正如预期的那样。
  • force_encoding 会有所帮助:例如response.force_encoding('ISO-8859-1').encode('UTF-8')
  • @muistooshort - 是的,你可以通过这种方式使用 force_encoding,我的意思是人们使用force_encoding 认为它会以某种方式对字符串进行转码,因为它会改变字符串的编码方式标记为。为了清楚起见,我将更新帖子。谢谢! @AmigoJack - 好的调用 - 当源/目标编码都已知时,您不必指定替换选项。当然,假设编码在源编码中是有效的。我会用更多的上下文更新答案。
猜你喜欢
  • 1970-01-01
  • 2016-12-02
  • 2011-06-19
  • 1970-01-01
  • 2021-05-26
  • 2019-04-09
  • 1970-01-01
  • 2016-11-28
相关资源
最近更新 更多