如何在字符串中翻译或删除“\ xC2 \ xBB”等字符序列?

时间:2010-12-22 00:26:28

标签: ruby character-encoding

如何在Ruby 1.9.2中的字符串中翻译或删除像“\ xC2 \ xBB”这样的字符序列?

1 个答案:

答案 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"