我正在尝试使用Ruby手动清除垃圾邮件,为什么下面的测试在返回false
时准确返回true
?经过测试的字符串是原始字符串,因此您可以从字面上将整个内容复制/粘贴到ruby控制台中以验证此示例:
irb(main):053:0> "Веautiful women fоr sеx in yоur town АU: https://links.wtf/qLFs".include? "sex"
=> false
提示:如果您通过自己输入在整个字符串中替换单词“ sex”,则测试将按true
预期返回。因此,以某种方式,两个“性别”字符串并不相同,但是处于什么水平?如何正确测试?
编辑:
我将其范围缩小到了这个范围(复制/粘贴以进行测试!):
irb(main):073:0> "е" == "e"
=> false
JavaScript的charCodeAt
方法告诉我,这两个字符是不同的Unicode值。Ruby的.ord
方法告诉我同样的事情。您可以在Ruby中更确切地检查那些Unicode值,但我建议您找到一种对数据进行规范化的方法,而不是为不寻常的字符添加无穷的条件。0x0435 1077 CYRILLIC SMALL LETTER IE
根据我在网上找到的Unicode查找表,这似乎是е。
另外,这是一种方法,您可以禁止所有西里尔字母。我使用了各种各样的排除字符,因此您可以根据需要添加排除项。
#!/usr/bin/env ruby
CYRILLIC_UNICODE_DECIMALS = *(1024..1273).freeze
for arg in ARGV
# next unless arg.is_a?(String)
arg.split('').each do |char|
p char if CYRILLIC_UNICODE_DECIMALS.include?(char.ord)
end
end
作为参考,以下是我针对您的示例使用的.ord
和.charCodeAt
方法。我从JavaScript开始,因为它是浏览器控制台中的简单测试。
2.6.3 :005 > 'е'.ord
=> 1077
2.6.3 :006 > 'e'.ord
=> 101
'"е" == "e"'.charCodeAt(1)
1077
'"e" == "e"'.charCodeAt(1)
101
此问题的最简单的方法将与扫描有问题的字符串/文本
gem "unicode-scripts"
在github.com/janlelis/unicode-scripts。然后,普通文本应返回一个最多包含以下2个元素的数组["Common", "Latin"]
。如果它包含任何其他元素,例如in["Common", "Cyrillic", "Latin"]
,则很有可能字符串/文本被“混淆”为垃圾邮件。