18

我似乎是一个非常简单且非常需要的方法。我需要从字符串中删除所有非 ASCII 字符。例如 © 等。请参见以下示例。

#coding: utf-8
s = " Hello this a mixed string © that I made."
puts s.encoding
puts s.encode

输出:

UTF-8
Hello this a mixed str

我做的┬⌐。

当我将此提供给 Watir 时,它会产生以下错误:不兼容的字符编码:UTF-8 和 ASCII-8BIT

所以我的问题是我想在使用它之前摆脱所有非 ASCII 字符。我不知道源字符串“s”使用哪种编码。

我已经搜索和试验了很长一段时间了。

如果我尝试使用

  puts s.encode('ASCII-8BIT')

它给出了错误:

 : "\xC2\xA9" from UTF-8 to ASCII-8BIT (Encoding::UndefinedConversionError)
4

3 回答 3

42

您可以直接将您要求的内容翻译成Regexp. 你写了:

我想摆脱所有非 ASCII 字符

我们可以稍微改写一下:

我想用什么都没有替换所有没有ASCII属性的字符

这是一个可以直接用 a 表示的语句Regexp

s.gsub!(/\P{ASCII}/, '')

作为替代方案,您还可以使用String#delete!

s.delete!("^\u{0000}-\u{007F}")
于 2010-07-08T09:07:12.663 回答
2

使用正则表达式去除字符。此示例在 C# 中,但正则表达式应该相同: 如何从字符串中去除非 ASCII 字符?(在 C# 中)

使用 gsub 将其翻译成 ruby​​ 应该不难。

于 2010-07-08T04:13:05.973 回答
1

UTF-8 是一种可变长度编码。当一个字符占用一个字节时,它的值与 7 位 ASCII 一致。那么为什么不直接在 MSB 中查找带有“1”的字节,然后删除它们和它们的预告片呢?一个以“110”开头的字节后跟一个额外的字节。以“1110”开头的字节后跟两个。以 '11110' 开头的字节后跟三个,这是 UTF-8 支持的最大值。

这一切都在我的脑海中。我可能是错的。

于 2010-07-08T04:10:57.803 回答