有时我在字符串中间有邪恶的不可打印字符.这些字符串是用户输入,所以我必须让我的程序接收它,而不是尝试更改问题的来源.
例如,它们可以在字符串的中间有zero width no-break space.例如,在解析.po文件时,一个有问题的部分是文件中间的字符串“他是一个神的人”.虽然一切看似正确,但用irb显示检查:
"he is a man of god".codepoints => [104,101,32,105,115,97,65279,109,110,111,102,103,100]
我相信我知道BOM是什么,我甚至可以很好地处理它.但是有时我在文件的中间有这样的字符,因此它不是BOM.
我目前的做法是以一种非常臭的方式删除所有我发现邪恶的角色:
text = (text.codepoints - CODEPOINTS_BlACKLIST).pack("U*")
我得到的最接近的是this post,这导致我:print:regexp上的选项.然而这对我没有好处:
"m".scan(/[[:print:]]/).join.codepoints => [65279,109]
所以问题是:如何从ruby中的字符串中删除所有不可打印的字符?
解决方法
Ruby可以帮助您将一个多字节字符集转换为另一个字节集.查看
these search results,并阅读Ruby String的
encode
方法.
此外,Ruby的Iconv是你的朋友.
最后,James Gray写了一篇series of articles,详细介绍了这一点.
使用这些工具可以做的事情之一就是告诉他们转码为视觉上相似的角色,或者完全忽略它们.
处理备用字符集是我曾经做过的最烦人的事情之一,因为文件可以包含任何内容,但可以标记为文本.您可能不会期望它然后您的代码会死或开始抛出错误,因为人们在提出将替代字符插入内容的方法时非常巧妙.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。