我需要从字符串中删除非UTF-8字符。这是文本的快照。
这是我在NPP中打开字符串时的样子,然后将编码设置为UTF-8:
我认为ACK
和FF
是非UTF-8字符。
我尝试了str.scrub
以及str.encode
。它们似乎都不起作用。 scrub
会返回相同的结果,encode
会导致错误。
答案 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"