有没有办法检查unicode文本是否使用某种语言?
我将从需要validation的用户获取文本是一个中文字符。
有什么方法可以检查吗?
根据unicode网站上提供的信息,您可以找到中文或任何其他语言的块,然后实现解析器以检查单词是否在范围内或不是。 就像
public bool IsChinese(string text) { return text.Any(c => c >= 0x20000 && c <= 0xFA2D); }
注意
作为一个方便的参考,Unicode Consortium 在这里提供了UnicodeHàn(汉) 数据库(Unihan)的搜索界面。
我上面提供的数据库链接显示了字符
您可以使用正则表达式与支持的命名块匹配:
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();
正如这里提到的几个人一样,在unicode中,中文,日文和韩文字符被编码在一起,并且有几个范围。 https://en.wikipedia.org/wiki/CJK_Compatibility
为简单起见,这是一个检测所有CJK范围的代码示例:
public bool IsChinese(string text) { return text.Any(c => (uint)c >= 0x4E00 && (uint)c <= 0x2FA1F); }
只需检查字符以查看代码点是否在所需范围内。 例如,请看这个问题:
Unicode中的汉字完整范围是什么?
根据维基百科( 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) )
在unicode中,中文,日文和韩文字符一起编码。
请访问此常见问题解答: http : //www.unicode.org/faq/han_cjk.html
汉字分布在几个街区。
访问此维基: https : //en.wikipedia.org/wiki/CJK_Unified_Ideographs
你会发现在unicode网站上有几个cjk字符图表。
为简单起见,您可以使用中文字符最小和最大范围:
要检查0x4e00和0x2fa1f。
这对我有用:
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; }
您需要查询Unicode字符数据库,其中包含每个unicode字符的信息。 在C#中可能有一个实用function可以为你做这个。 否则你可以从互联网上下载。