要将字符串转换为 UTF-8 并替换所有编码错误,您可以执行以下操作:
str.encode('utf-8', :invalid=>:replace)
唯一的问题是,如果已经是 UTF-8,它就不起作用str
,在这种情况下,任何错误仍然存在:
irb> x = "foo\x92bar".encode('utf-8', :invalid=>:replace)
=> "foo\x92bar"
irb> x.valid_encoding?
=> false
引用Ruby 文档:
请注意,从编码转换
enc
为相同编码enc
是无操作的,即返回接收器时不做任何更改,并且不会引发异常,即使存在无效字节也是如此。
显而易见的解决方法是先转换为不同的 Unicode 编码,然后再转换回 UTF-8:
str.encode('utf-16', :invalid=>:replace).encode('utf-8')
例如:
irb> x = "foo\x92bar".encode('utf-16', :invalid=>:replace).encode('utf-8')
=> "foo�bar"
irb> x.valid_encoding?
=> true
有没有更好的方法可以在不转换为虚拟编码的情况下做到这一点?