2011-05-22 54 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

相關問題