如何删除ruby中不可打印/不可见的字符?

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

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

我得到的最接近的是这篇post ,它引导我:print: regexp上的选项。 然而这对我没有好处:

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

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

Ruby可以帮助您将一个多字节字符集转换为另一个字节集。 查看这些搜索结果 ,并阅读Ruby String的encode方法。

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

最后,詹姆斯格雷写了一系列文章 ,详细介绍了这一点。

使用这些工具可以做的事情之一就是告诉他们转码为视觉上相似的角色,或者完全忽略它们。

处理备用字符集是我曾经做过的最烦人的事情之一,因为文件可以包含任何内容,但可以标记为文本。 您可能不会期望它然后您的代码会死或开始抛出错误,因为人们在提出将替代字符插入内容的方法时非常巧妙。

试试这个:

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

我在ROR版本3.9.3中也遇到了同样的问题,我使用Visual Studio 2010作为编辑器。 Notepad ++解决了我的问题。

如果您使用的是Notepad ++,则问题出在UTF-8文件中:

  1. 打开文件
  2. 在编码菜单中选择“在没有BOM的UTF-8中编码”,如屏幕截图所示

屏幕截图显示上述菜单项

有关详细信息, 请参阅此