如何从Ruby中的字符串中删除所有非ASCII字符

时间:2010-07-08 04:06:05

标签: ruby watir

我似乎是一个非常简单且非常需要的方法。我需要从字符串中删除所有非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

ing┬⌐我做的。

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

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

我一直在寻找和尝试很长一段时间。

如果我尝试使用

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

它给出错误:

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

3 个答案:

答案 0 :(得分:36)

您可以直接将您提出的问题翻译成Regexp。你写道:

  

我想摆脱所有非ASCII字符

我们可以稍微改写一下:

  

我想替换所有没有ASCII属性而没有

的字符

这是一个可以直接表达的声明Regexp

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

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

s.delete!("^\u{0000}-\u{007F}")

答案 1 :(得分:2)

使用正则表达式删除字符。这个例子在C#中,但正则表达式应该是相同的: How can you strip non-ASCII characters from a string? (in C#)

使用gsub将其翻译成ruby并不困难。

答案 2 :(得分:1)

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

这一切都在我的头顶。我错了。