如何正确处理UTF-8字符串中的无效字节?

时间:2015-08-19 10:07:13

标签: ruby-on-rails ruby encoding

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

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

我想将其转码为UTF-8,因为没有char可视化问题。 当然,\xE8不是UTF-8中的有效序列,因此我在尝试时遇到错误:

str.encode 'utf-8'

返回:

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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