问题两个最好的方法来做到这一点,但Martijn做了一个可以理解的b当在这里复制第二种方法到他的答案时,不正确的改变。做.encode('UTF-8',<选项>).encode('UTF-8')不起作用。正如在另一个问题的原始答案中所指出的那样,关键在于编码为不同的编码,然后返回到UTF-8。如果您的原始字符串已经在ruby的内部标记为UTF-8,那么ruby将忽略任何调用将其编码为UTF-8。
在以下示例中,我将使用“a#{0xFF.chr} b”.force_encoding('UTF-8')生成一个字符串,该字符串认为是UTF-8但包含无效的UTF-8字节。
1.9.3p194 :019 > "a#{0xFF.chr}b".force_encoding('UTF-8')
=> "a\xFFb"
1.9.3p194 :020 > "#{0xFF.chr}".force_encoding('UTF-8').encoding
=> #<Encoding:UTF-8>
注编码成UTF-8怎么什么都不做:
1.9.3p194 :016 > "a#{0xFF.chr}b".force_encoding('UTF-8').encode('UTF-8', :invalid => :replace, :replace => '').encode('UTF-8')
=> "a\xFFb"
但编码到别的东西(UTF-16),然后返回到UTF-8清理字符串:
1.9.3p194 :017 > "a#{0xFF.chr}b".force_encoding('UTF-8').encode('UTF-16', :invalid => :replace, :replace => '').encode('UTF-8')
=> "ab"
我认为你正在尝试的是非常危险的。文本编码就像怀孕一样:要么有UTF8,要么没有。你不能只有一点UTF8。如果有错误,你*有*放弃。否则,您的转换器可能容易受到恶意准备字符串的攻击。 – 2012-02-03 10:06:17
我正在写一个履带式,那里有一个网页,有点无效。因此清理字节是我所能做的。 – lulalala 2012-02-03 10:40:25