如何确定一个字符是否为中文字符

10

如何使用 Ruby 确定一个字符是否为汉字?


它们通常比片假名或平假名更多笔画。并且一般只在更复杂的汉字上使用 ruby...等等,这是日本.SE还是堆栈溢出? - Andrew Grimm
2个回答

18

Ruby 1.9

#encoding: utf-8   
 "漢" =~ /\p{Han}/

我使用了这段代码,但它无法工作。 这是错误信息:无效的字符属性名称{Han}:/\p{Han}/。 - HelloWorld
1
@HelloWorld:请更新您的 Ruby 版本。现在所有字符类都有文档记录了:http://github.com/ruby/ruby/blob/trunk/doc/re.rdoc(顺便说一句,很酷的昵称)。 - Marc-André Lafortune
上面的链接已经失效了,但是你可以在 Ruby 文档的正则表达式部分找到所有的信息:http://www.ruby-doc.org/core-2.0.0/Regexp.html#label-Character+Properties - deRailed
如果你遇到了“invalid character property name {Han}”这个问题,有时可以通过添加 /u: "漢" =~ /\p{Han}/u 来解决。 - Sprachprofi

7
这是一篇关于Ruby编码的有趣文章:http://blog.grayproductions.net/articles/bytes_and_characters_in_ruby_18(这是一个系列文章的一部分,请查看文章开头的目录)。
我以前没有使用过中文字符,但这似乎是Unicode支持的列表:http://en.wikipedia.org/wiki/List_of_CJK_Unified_Ideographs。请注意,它是包括日语和韩语字符在内的统一系统(它们之间共享某些字符),不确定您能否区分哪些是仅限于中文的。
我认为您可以通过调用以下内容来检查它是否为CJK字符:对于字符串str和索引n处的字符,请执行此操作:
def check_char(str, n)
  list_of_chars = str.unpack("U*")
  char = list_of_chars[n]
  #main blocks
  if char >= 0x4E00 && char <= 0x9FFF
    return true
  end
  #extended block A
  if char >= 0x3400 && char <= 0x4DBF
    return true
  end
  #extended block B
  if char >= 0x20000 && char <= 0x2A6DF
    return true
  end
  #extended block C
  if char >= 0x2A700 && char <= 0x2B73F
    return true
  end
  return false
end

@sam 这些是CJK范围。这些是中文,日文和韩文字符(假设范围正确,我相信它们是正确的)。 - Michael Lowman
@Michael Lowman,我用韩文、日文和所有的1..9 a..z测试了一些字符,它们都返回false,更不用说对中文返回true了。我如何检查一个字符是繁体还是简体呢? - thenengah
还有,这些范围是从哪里来的?是从Unihan中获取的吗?具体是哪个页面? - thenengah
1
在提到的维基百科页面上,每个块都有一个包含其字符的图表列表。我使用了这些范围。 - Andrei Fierbinteanu
能否区分繁体和简体字? - thenengah
不是很容易,但这个库可以做到。仅适用于 Ruby 1.9+。https://github.com/jpatokal/script_detector - lambshaanxy

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