10

有时我在字符串中间有邪恶的不可打印字符。这些字符串是用户输入的,所以我必须让我的程序很好地接收它,而不是试图改变问题的根源。

例如,它们可以在字符串中间有零宽度的不间断空格。例如,在解析文件时,一个有问题的部分是文件中间的字符串。虽然一切看起来都是正确的,但通过以下节目进行检查:.po"he is a man of god"irb

 "he is a man of god".codepoints
 => [104, 101, 32, 105, 115, 32, 97, 32, 65279, 109, 97, 110, 32, 111, 102, 32, 103, 111, 100] 

我相信我知道 aBOM是什么,我什至可以很好地处理它。但是有时我在文件中间有这样的字符,所以它不是BOM.

我目前的方法是以一种非常臭的方式删除所有我发现邪恶的角色:

text = (text.codepoints - CODEPOINTS_BlACKLIST).pack("U*")

我得到的最接近的是关注这篇文章,这使我:print:选择了正则表达式。然而这对我没有好处:

"m".scan(/[[:print:]]/).join.codepoints
 => [65279, 109] 

所以问题是:如何从 ruby​​ 中的字符串中删除所有不可打印的字符?

4

3 回答 3

21

尝试这个:

>>"aaa\f\d\x00abcd".gsub(/[^[:print:]]/,'.')
=>"aaa.d.abcd"
于 2014-07-17T08:02:10.610 回答
1

Ruby 可以帮助您从一种多字节字符集转换为另一种。检查搜索结果,并阅读 Ruby String 的encode方法。

另外,Ruby 的Iconv是你的朋友。

最后,James Gray 写了一系列文章,详细介绍了这一点。

您可以使用这些工具做的一件事是告诉他们转码为视觉上相似的字符,或者完全忽略它们。

处理备用字符集是我曾经做过的最令人恼火的事情之一,因为文件可以包含任何内容,但会被标记为文本。你可能没有预料到,然后你的代码就会死掉或开始抛出错误,因为人们在想出将替代字符插入内容的方法时是如此巧妙。

于 2013-05-13T19:59:20.920 回答
1

代码点 65279 是一个零宽度不间断空格。它通常用作字节顺序标记 (BOM)

您可以使用以下命令将其从字符串中删除:

my_new_string = my_old_string.gsub!("\xEF\xBB\xBF".force_encoding("UTF-8"), '')

检查是否有任何不可见字符的快速方法是检查字符串的长度,如果它高于您在 IRB 中看到的长度,您就可以。

于 2020-07-28T08:56:23.870 回答