【问题标题】:How to properly handle invalid bytes in UTF-8 strings?如何正确处理 UTF-8 字符串中的无效字节?
【发布时间】:2015-08-19 10:07:13
【问题描述】:

我有一个编码为 ASCII-8BIT 的字符串:

str = 'quindi \xE8 al \r\ngoverno'

我想将其转码为 UTF-8,因为字符可视化没有问题。 当然,\xE8 不是 UTF-8 中的有效序列,所以当我尝试这样做时会出现错误:

str.encode 'utf-8'

返回:

UndefinedConversionError "\xE8" from ASCII-8BIT to UTF-8

阅读有关编码方法的文档,我想出了这个解决方案:

encode('UTF-8', invalid: :replace, undef: :replace)

这样,所有无效序列都将替换为?。但是如果我想显示正确的字符而不是?。我在这个文本中有不同的转义序列,\xE8\xE0 ...

有没有办法用正确的转义字符自动替换它们?

【问题讨论】:

  • 什么是正确的字符,即您的预期输出是什么?
  • 类似于“è”。

标签: ruby-on-rails ruby encoding


【解决方案1】:

您的字符串似乎是ISO-8859-1 编码的。这应该有效:

str = "quindi \xE8 al \r\ngoverno"

str.force_encoding('ISO-8859-1').encode('UTF-8')
#=> "quindi è al \r\ngoverno"

请注意,您必须使用双引号。

【讨论】:

  • 我对此感到不满。但我担心的是,为什么它表明我是 Ascii-8bit?而且,我需要处理很多不同的编码文本(我处理电子邮件),所以这段代码会导致所有不同于 Iso-8859 的字符集出现问题
  • @ciaoben 电子邮件通常包含指定编码的标头,例如Content-Type: text/plain; charset="iso-8859-1"。但是任何体面的电子邮件库都应该能够为您处理这个问题。不要重新发明轮子;-)
猜你喜欢
  • 1970-01-01
  • 2011-10-25
  • 2015-12-28
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 2014-07-18
相关资源
最近更新 更多