Unicode 检测字符是简体字还是繁体字

Unicode 检测字符是简体字还是繁体字,unicode,cjk,Unicode,Cjk,我发现这使我能够检查字符串是否包含汉字。我不确定unicode范围是否正确,但它们似乎在日语和韩语中返回false,在汉语中返回true 它没有做的是判断字符是繁体还是简体中文。你将如何着手发现这一点 更新 问:如果是中文、韩文或日文字符,如何从Unicode字符的32位值识别 他们的论点是,无论形状如何,字符都具有相同的含义,因此应该用相同的代码表示。嗯,这对我来说并不是毫无意义的,因为我正在分析与他们的解决方案不匹配的单个角色: 一个更好的解决方案是从整体上看文本:如果有相当数量的假名,

我发现这使我能够检查字符串是否包含汉字。我不确定unicode范围是否正确,但它们似乎在日语和韩语中返回false,在汉语中返回true

它没有做的是判断字符是繁体还是简体中文。你将如何着手发现这一点


更新 问:如果是中文、韩文或日文字符,如何从Unicode字符的32位值识别

他们的论点是,无论形状如何,字符都具有相同的含义,因此应该用相同的代码表示。嗯,这对我来说并不是毫无意义的,因为我正在分析与他们的解决方案不匹配的单个角色:

一个更好的解决方案是从整体上看文本:如果有相当数量的假名,可能是日语,如果有相当数量的韩语,可能是韩语


我想你已经发现了,你不能。简体和繁体只是书写相同字符的两种风格——就像欧洲语言中罗马和哥特式脚本的区别一样。

如前所述,您无法从单个字符中可靠地检测到脚本样式,但对于足够长的文本样本是可能的。请参阅,以获取执行此任务的Ruby gem,并进行一般性讨论。

某些字符也可以。传统字符集和简化字符集重叠,因此基本上有三组字符:

  • 只有传统的字符
  • 仅简化的字符
  • 未触及的字符,并且在这两种语言中都可用
  • 以角色为例面 例如。它同时属于#2和#3。。。作为一个简体字,它代表和、面和面。鉴于麵 只是一个传统的字符。所以在Unihan数据库中,麵 有一个
    ksimpilifiedvariant
    ,指向。所以你可以推断它只是一个繁体字

    但也有一个
    ktradionalvariant
    ,它指向。这就是系统崩溃的地方:如果您使用此数据扣除面 只是一个简体字,你错了


    另一方面,有一个
    ktradionalvariant
    ,指向,这两个是“真正的”简化/传统对。但Unihan数据库中没有区分以下情况韓/韩 例如麵/面.

    代码页有助于区分吗?看起来简体中文是CP936,繁体中文是CP950,至少在微软世界是这样。也许从MS和IBM代码页开始吧。我在谷歌上快速搜索了一下,发现了一些有趣的问题,其中也讨论了繁体字。希望有帮助!Shadded的链接FAQ似乎准确地回答了您的问题。如链接注释中的示例所示,您如何确定“聊天”是英语还是法语?如果你认为你的答案不在这里,你可能想把你的问题扩大一点。这是一个很好的链接,我之前已经找到了。啊相当复杂。chat/chat en/fn的正字法无疑使其难以区分;然而,如果我们用IPA来写chat/chat[ʃæ/tʃæt],就有可能通过音节结构来写,因为它是基于声音的,而不是一种古老的正字法。但汉语的复杂性要小得多,因为說/说 [t/s shuo1'to speak']是完全不同的字符,一个是传统的等效于speak,另一个是简化的等效于speak。它们有不同的unicode值,与a/a en/fn相反,a/a en/fn共享相同的字符代码。是的,我想是这样。函数优于形式类型的东西。这是第二十二条军规。您必须知道字符是否为S/T才能检查其值。因此,我将首先构建字典,然后通过这些字典进行检查:)顺便说一句,实际上有一种方法可以检查字节,但是unicode网站说这是不切实际的,因为存在大量的异常。算了吧!:)这是错误的,与罗马/哥特式的类比也是错误的。正如dda下面解释的,简化字符集和传统字符集是重叠的。字符可以是:1)只有繁体字,2)只有简体字,或者3)两者都有。因为每个字符都有自己独特的Unicode代码点,所以您至少可以自动检测它们属于这三个类别中的哪一个。回复:罗马/哥特式,你的意思似乎是排版脚本(字体),而不是字母表,但Trad/Simp肯定不仅仅是相同bytestream的不同字体。这应该是公认的答案。