2011-05-22 87 views
13

我会从用户那里获取我需要验证的文本是中文字符。有没有办法来检查unicode文本是否在某种语言?

有什么方法可以检查吗?

+2

检查如果字符串包含唯一有效的字符,中国是不一样的说这是在中国。显然你可以写出无意义的汉字字符串。但我也在思考与中国人分享很多人物的语言(日语,古老的韩国文字)。请参阅CJK统一。我的两分钱。 – 2011-05-23 14:00:58

回答

15

根据所提供的信息here in unicode website,您可以找到中国或任何其他语言的块,然后执行一个解析器来检查,如果一个字的范围或没有。就像

public bool IsChinese(string text) 
{ 
    return text.Any(c => c >= 0x20000 && c <= 0xFA2D); 
} 

注意

作为一个方便的参考,Unicode协会here提供了对Unicode的HAN(汉)Database (Unihan)搜索界面。

我想以上提供的数据库链接显示你的人物

+6

0x20000大于0xfa2d。条件c> = 0x20000 && c <= 0xFA2D? – cxwangyi 2014-11-17 01:45:41

-1

您需要查询包含每个unicode字符信息的Unicode字符数据库。 C#中可能有一个实用程序功能可以为您执行此操作。否则,你可以从互联网下载它。

6

您可以使用正则表达式匹配Supported Named Blocks

private static readonly Regex cjkCharRegex = new Regex(@"\p{IsCJKUnifiedIdeographs}"); 
public static bool IsChinese(this char c) 
{ 
    return cjkCharRegex.IsMatch(c.ToString()); 
} 

然后,您可以使用:

if (sometext.Any(z=>z.IsChinese())) 
    DoSomething(); 
0

根据维基百科(https://en.wikipedia.org/wiki/CJK_Compatibility),有几个字符代码diapasons。 这里是我的方法来检测基于上面的链接中国字符(F#代码,但它可以很容易地转换)

let isChinese(text: string) = 
      text |> Seq.exists (fun c -> 
       let code = int c 
       (code >= 0x4E00 && code <= 0x9FFF) || 
       (code >= 0x3400 && code <= 0x4DBF) || 
       (code >= 0x3400 && code <= 0x4DBF) || 
       (code >= 0x20000 && code <= 0x2CEAF) || 
       (code >= 0x2E80 && code <= 0x31EF) || 
       (code >= 0xF900 && code <= 0xFAFF) || 
       (code >= 0xFE30 && code <= 0xFE4F) || 
       (code >= 0xF2800 && code <= 0x2FA1F) 
       ) 
0

这为我工作:

var charArray = text.ToCharArray(); 
var isChineseTextPresent = false; 


foreach (var character in charArray) 
{ 
    var cat = char.GetUnicodeCategory(character); 


    if (cat != UnicodeCategory.OtherLetter) 
    { 
     continue; 
    } 


    isChineseTextPresent = true; 
    break; 
} 
3

正如一些人在这里提到的,在Unicode中,中国,日本和韩文字符编码在一起,并有几个范围吧。 https://en.wikipedia.org/wiki/CJK_Compatibility

为了简单起见,这里的检测所有的CJK范围内的代码示例:

public bool IsChinese(string text) 
{ 
    return text.Any(c => (uint)c >= 0x4E00 && (uint)c <= 0x2FA1F); 
} 
+0

谢谢!这对我来说有些中文字符不适用于@ nasser-hadjloo的答案。 – 2017-08-31 07:46:19

相关问题