如何从字符串中删除非UTF-8字符?

时间:2017-08-15 11:56:12

标签: ruby string utf-8

我需要从字符串中删除非UTF-8字符。这是文本的快照。

enter image description here

这是我在NPP中打开字符串时的样子,然后将编码设置为UTF-8:

enter image description here

我认为ACKFF是非UTF-8字符。

我尝试了str.scrub以及str.encode。它们似乎都不起作用。 scrub会返回相同的结果,encode会导致错误。

1 个答案:

答案 0 :(得分:3)

我们遇到了一些问题。

最大的问题是Ruby String存储任意字节以及假定的编码,并不保证字节在该编码中有效,并且没有明显的理由选择该编码。 (我可能会偏袒Python 3的重度用户。我们永远不会谈论"将字符串从一种编码更改为另一种编码"。)

幸运的是,编辑没有吃掉你的帖子,但很难看出来。我猜你将字符串解码为Windows-1252以便显示它,这只会模糊问题。

这是我看到的你的字符串:

>> s = "\x06-~$A\xA7ruG\xF9\"\x9A\f\xB6/K".b
=> "\x06-~$A\xA7ruG\xF9\"\x9A\f\xB6/K"
>> s.bytes
=> [6, 45, 126, 36, 65, 167, 114, 117, 71, 249, 34, 154, 12, 182, 47, 75]

它确实包含无效UTF-8的字节。

>> s.encoding
=> #<Encoding:ASCII-8BIT>
>> String::new(s).force_encoding(Encoding::UTF_8).valid_encoding?
=> false

我们可以要求将其解码为UTF-8并插入�我们遇到无效UTF-8的字节

>> s.encode('utf-8', 'binary', :undef => :replace)
=> "\u0006-~$A�ruG�\"�\f�/K"