Я получаю текст от пользователя, который мне нужен для проверки, - это китайский символ.
Можно ли это проверить?
Я получаю текст от пользователя, который мне нужен для проверки, - это китайский символ.
Можно ли это проверить?
В соответствии с предоставленной информацией здесь, на веб-сайте Юникода вы можете найти блок китайского языка или любой другой язык, а затем реализовать парсер, чтобы проверить, слово находится в диапазоне или нет. точно так же, как
public bool IsChinese(string text)
{
return text.Any(c => c >= 0x20000 && c <= 0xFA2D);
}
Обратите внимание, что
В качестве удобной ссылки Консорциум Unicode здесь предоставляет интерфейс поиска для Unicode Hà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();
Как упоминалось здесь несколько человек, в юникоде, китайский, японский и корейский символы кодируются вместе, и есть несколько диапазонов. https://en.wikipedia.org/wiki/CJK_Compatibility
Для простоты здесь приведен пример кода, который определяет весь диапазон CJK:
public bool IsChinese(string text)
{
return text.Any(c => (uint)c >= 0x4E00 && (uint)c <= 0x2FA1F);
}
Просто проверьте символы, чтобы увидеть, находятся ли кодовые точки в требуемом диапазоне (диапазонах). Для примера см. Этот вопрос:
В соответствии с википедией (https://en.wikipedia.org/wiki/CJK_Compatibility) существует несколько диапазонов кода символов. Вот мой подход к обнаружению китайских иероглифов по ссылке выше (код в 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, chinese, japan и Korean кодируются вместе.
посетите этот FAQ: http://www.unicode.org/faq/han_cjk.html
китайский символ распределяется в серверных блоках.
Посетите эту вики: https://en.wikipedia.org/wiki/CJK_Unified_Ideographs
В юникодном веб-сайте вы найдете серверные диаграммы символов 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;
}
Вам нужно запросить базу данных символов Юникода, которая содержит информацию о каждом символе юникода. Вероятно, в С# есть функция утилиты, которая может сделать это для вас. В противном случае вы можете загрузить его из Интернета.