如何在Ruby 1.9.2中的字符串中翻译或删除像“\ xC2 \ xBB”这样的字符序列?
答案 0 :(得分:3)
当字符串使用不处理这些字节的编码时,您通常会看到类似的十六进制字节。如果你知道字符串应该使用什么编码,你可以使用String#force_encoding
根据你想要的编码重新解释字节。
# Under a UTF-8 locale:
ruby-1.9.2-head :013 > "\xC2\xBB".force_encoding(Encoding::UTF_8)
=> "»"
# Under the “C” locale:
ruby-1.9.2-head :007 > "\xC2\xBB".force_encoding(Encoding::UTF_8)
=> "\u00BB"
两者都在内部产生相同的UTF-8编码字符串。在C语言环境下,Ruby打印一个转义版本以避免将二进制数据打印到终端(根据语言环境设置,可能不支持它)。
如果字符串已经使用了适当的编码,那么您应该在使用之前将字符串重新编码为所需的输出编码:
# Under a UTF-8 locale:
ruby-1.9.2-head :026 > "\xC2\xBB".force_encoding(Encoding::ISO_8859_1).encode(Encoding::UTF_8)
=> "»"
# Under the “C” locale:
ruby-1.9.2-head :014 > "\xC2\xBB".force_encoding(Encoding::ISO_8859_1).encode(Encoding::UTF_8)
=> "\u00C2\u00BB"
上面,我使用String#force_encoding
来确保字符串中的字节被标记为ISO 8859-1(因为,例如,伴随字节的标题表示它们表示ISO 8859-1编码的字符串)然后使用String#encode
将其重新编码为UTF-8(所需的输出编码)。
最后,如果您真的只想删除任何非ASCII的内容,可以使用带有String#gsub
的否定[:ascii:]
字符类:
ruby-1.9.2-head :030 > "foo\xC2\xBBbar".force_encoding(Encoding::UTF_8).gsub(/[[:^ascii:]]/,'')
=> "foobar"