温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Ruby: Testing a ruby string for a substring fails (substring is not recognized)
ruby string character

其他 - Ruby:测试Ruby字符串的子字符串失败(无法识别子字符串)

发布于 2020-03-29 22:05:14

我正在尝试使用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

查看更多

提问者
TomDogg
被浏览
185
Patrick Taylor 2020-01-31 20:40

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