首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Ruby中检测字符串中的某些Unicode字符?

如何在Ruby中检测字符串中的某些Unicode字符?
EN

Stack Overflow用户
提问于 2011-01-13 22:22:25
回答 4查看 5.9K关注 0票数 17

给定Ruby 1.8.7中的一个字符串(没有支持带\p{}的Unicode属性的出色的Oniguruma正则表达式引擎),我希望能够确定该字符串是否包含一个或多个中文、日文或韩文字符;

代码语言:javascript
复制
class String
  def contains_cjk?
    ...
  end
end

>> '日本語'.contains_cjk?
=> true
>> '광고 프로그램'.contains_cjk?
=> true
>> '艾弗森将退出篮坛'.contains_cjk?
=> true
>> 'Watashi ha bakana gaijin desu.'.contains_cjk?
=> false

我怀疑这将归结为查看字符串中的任何字符是否在Unihan CJKV Unicode blocks中,但我认为有必要询问是否有人知道Ruby语言中现有的解决方案。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-13 23:13:07

(ruby 1.9.2)

代码语言:javascript
复制
#encoding: UTF-8
class String
  def contains_cjk?
    !!(self =~ /\p{Han}|\p{Katakana}|\p{Hiragana}|\p{Hangul}/)
  end
end

strings= ['日本', '광고 프로그램', '艾弗森将退出篮坛', 'Watashi ha bakana gaijin desu.']
strings.each{|s| puts s.contains_cjk?}

#true
#true
#true
#false

\p{}匹配字符的Unicode脚本。

支持以下脚本:阿拉伯语、亚美尼亚语、巴厘语、孟加拉语、博波莫夫语、盲文、布吉尼语、布希德语、Canadian_Aboriginal、卡里安语、查姆语、切罗基语、通用、科普特人、楔形文字、塞语、西里尔文、沙漠、德瓦纳加里文、埃塞俄比亚文、格鲁吉亚文、格拉斯哥里文、哥特文、希腊文、古吉拉特文、古吉拉特文、古尔穆赫希文、韩文、韩文、汉努乌文、希伯来文、平假名、继承、卡纳达文、片塔纳文、Kayah_Li、哈罗什提、高棉文、老语、拉丁文、莱普查、利姆布、Linear_B、Lycian、Lydian、马拉雅拉姆、蒙古文、缅甸、New_Tai_Lue、Nko、Ogham、Ol_Chiki、Old_Italic、Old_Persian、奥里亚、奥斯曼尼亚、塔班瓦、Phags_Pa、泰米尔语、泰米尔语、泰卢固语、塔那那语、泰语、藏语、提芬那语、乌加里特语、瓦伊语和彝语。

哇。Ruby Regexp source

票数 47
EN

Stack Overflow用户

发布于 2011-01-13 23:48:11

考虑到Ruby 1.8.7的限制,这是我能做的最好的事情:

代码语言:javascript
复制
class String
  CJKV_RANGES = [
      (0xe2ba80..0xe2bbbf),
      (0xe2bfb0..0xe2bfbf),
      (0xe38080..0xe380bf),
      (0xe38180..0xe383bf),
      (0xe38480..0xe386bf),
      (0xe38780..0xe387bf),
      (0xe38880..0xe38bbf),
      (0xe38c80..0xe38fbf),
      (0xe39080..0xe4b6bf),
      (0xe4b780..0xe4b7bf),
      (0xe4b880..0xe9bfbf),
      (0xea8080..0xea98bf),
      (0xeaa080..0xeaaebf),
      (0xeaaf80..0xefbfbf),
  ]

  def contains_cjkv?
    each_char do |ch|
      return true if CJKV_RANGES.any? {|range| range.member? ch.unpack('H*').first.hex }
    end
    false
  end
end


strings = ['日本', '광고 프로그램', '艾弗森将退出篮坛', 'Watashi ha bakana gaijin desu.']
strings.each {|s| puts s.contains_cjkv? }

#true
#true
#true
#false

很老套,但很管用。它实际上也可以检测到各种印度文字,所以它可能真的应该被称为contains_asian?

也许我应该为其他坚持使用Ruby1.8的可怜的I18N黑客做点什么。

票数 9
EN

Stack Overflow用户

发布于 2012-06-04 09:26:30

我已经写了一个小宝石,打包了steenslag上面的答案中的方法:

https://github.com/jpatokal/script_detector

它还可以尝试区分日语、韩语、简体中文和繁体中文,尽管由于汉语言统一的复杂性,它只能可靠地处理大段文本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4681055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档