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

Nic*_*ick 17 ruby watir

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

#coding: utf-8
s = " Hello this a mixed string © that I made."
puts s.encoding
puts s.encode
Run Code Online (Sandbox Code Playgroud)

输出:

UTF-8
Hello this a mixed str
Run Code Online (Sandbox Code Playgroud)

我做的.

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

所以我的问题是我想在使用它之前去除所有非ASCII字符.我不知道源字符串"s"使用哪种编码.

我一直在搜索和试验很长一段时间.

如果我尝试使用

  puts s.encode('ASCII-8BIT')
Run Code Online (Sandbox Code Playgroud)

它给出了错误:

 : "\xC2\xA9" from UTF-8 to ASCII-8BIT (Encoding::UndefinedConversionError)
Run Code Online (Sandbox Code Playgroud)

Jör*_*tag 37

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

我想摆脱所有非ASCII字符

我们可以稍微改写一下:

我想替换所有ASCII没有任何东西的属性

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

s.gsub!(/\P{ASCII}/, '')
Run Code Online (Sandbox Code Playgroud)

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

s.delete!("^\u{0000}-\u{007F}")
Run Code Online (Sandbox Code Playgroud)

  • 1000.times {puts"6 out of 5 stars"} - 这节省了我的培根Jörg.感谢您通过代理教育我. (7认同)
  • 对于ruby 1.9,.3你需要使用delete,而不是{ASCII}方法 (2认同)

Bor*_*lid 1

UTF-8 是一种可变长度编码。当一个字符占据一个字节时,其值与 7 位 ASCII 一致。那么为什么不直接查找 MSB 中带有“1”的字节,然后删除它们及其尾部呢?以“110”开头的字节后面将跟着一个附加字节。以“1110”开头的字节后面将跟随两个。以“11110”开头的字节后面将跟随三个,这是 UTF-8 支持的最大字节数。

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