如何在Ruby中检查字符串是否包含类似é这样的重音拉丁字符?

3

给定:

str1 = "é"   # Latin accent
str2 = "囧"  # Chinese character
str3 = "ジ"  # Japanese character
str4 = "e"   # English character

如何区分str1(拉丁重音字符)和其他字符串?
更新:
给定:
str1 = "\xE9" # Latin accent é actually stored as \xE9 reading from a file

答案会有什么不同?

我认为你的意思是双引号 "\xE9"。 - Matt Brictson
谢谢!我已经编辑了它。 - sbs
3个回答

3

我会首先使用gsub去除所有纯ASCII字符,然后使用正则表达式检查是否还有拉丁字符。这样可以检测出带重音的拉丁字符。

def latin_accented?(str)
  str.gsub(/\p{Ascii}/, "") =~ /\p{Latin}/
end

latin_accented?("é")  #=> 0 (truthy)
latin_accented?("囧") #=> nil (falsy)
latin_accented?("ジ") #=> nil (falsy)
latin_accented?("e")  #=> nil (falsy)

“é” 实际上以 "\xE9" 的形式存储在文件中。我已经更新了我的问题。在这种情况下,你能帮忙吗? - sbs
在这种情况下,该文件可能是以ISO-8859-1编码的。在进行正则表达式检查之前,请读取文件并将其转换为UTF-8。IO.read("myfile", :encoding => "ISO-8859-1:UTF-8") - Matt Brictson
如果那个 str="\xE9" 是我无法更改的东西,该怎么识别它呢? - sbs
可能有更好的方法,但这将检测str中的“\xE9”:str.force_encoding(“binary”)。include?(“\xE9”。force_encoding(“binary”)) - Matt Brictson

1

我会采用双重方法:

  1. 通过将字符串编码为Latin-1(ISO-8859-1)来排除包含非拉丁字符的字符串。
  2. 使用正则表达式测试带重音符号的字符。

例如:

def is_accented_latin?(test_string)
  test_string.encode("ISO-8859-1")   # just to see if it raises an exception

  test_string.match(/[ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöùúûüýþÿ]/)
rescue Encoding::UndefinedConversionError
  false
end

我强烈建议您自己选择要筛选的重音字符,而不是只复制我写的内容;我肯定会漏掉一些。还要注意,即使字符串中还包含带重音符号的拉丁字符,但对于包含非拉丁字符的字符串,这将始终返回 false

1
尝试使用/\p{Latin}/.match(strX)/\p{Latin}&&[^a-zA-Z]/(如果您只想检测特殊的拉丁字符)。
顺便说一下,"e"(str4)也是拉丁字符。
希望这可以帮到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接