如何删除非打印/不可见的字符在红宝石?(How to remove non-printable/in

2019-09-02 23:32发布

有时候,我有一个字符串中间恶非打印字符。 这些字符串是用户输入的,所以我必须让我的程序收到很好,而不是试图改变问题的根源。

例如,它们可以具有零宽度无间断间隔的字符串的中间 。 例如,在解析.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] 

我相信,我知道什么BOM是,我甚很好地处理它。 不过有时我对文件中这样的人物,所以它不是一个BOM

我目前的做法是删除,我发现邪恶真是臭时尚的所有字符:

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

最贴近我得到的是下面这个帖子 ,其含铅我:print:在正则表达式选项。 然而,它是不适合我:

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

所以问题是: 如何从红宝石字符串中删除所有非打印字符?

Answer 1:

红宝石可以帮助你从设置到另一个多字节字符转换。 检查到的搜索结果 ,再加上Ruby的字符串的阅读了encode方法。

此外,Ruby的语言Iconv是你的朋友。

最后,詹姆士·格雷撰写了一系列文章 ,涵盖本在良好的细节。

一,你可以使用这些工具做的事情就是告诉他们转码视觉类似的字符,或者完全忽略它们。

与备选字符集打交道是最...刺激性的东西我曾经有过做一个,因为文件可以包含任何东西,但被标记为文本。 你可能不希望它,然后你的代码死亡或开始引发错误,因为人们是如此巧妙的方法,来插入备选字符到内容上来的时候。



Answer 2:

试试这个:

>>"aaa\f\d\x00abcd".gsub(/[^[:print:]]/,'.')
=>"aaa.d.abcd"


文章来源: How to remove non-printable/invisible characters in ruby?