Есть ли способ проверить, есть ли текст Unicode на определенном языке? - PullRequest
20 голосов
/ 22 мая 2011

Я получу текст от пользователя, который мне нужно проверить, это китайский символ.

Есть ли способ проверить это?

Ответы [ 8 ]

18 голосов
/ 25 мая 2011

В соответствии с информацией, предоставленной здесь, на веб-сайте Unicode , вы можете найти блок на китайском или любом другом языке, а затем реализовать синтаксический анализатор, чтобы проверить, находится ли слово в диапазоне или нет. так же, как

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

Обратите внимание, что

В качестве удобного справочника Консорциум Unicode здесь предоставляет интерфейс поиска для базы данных Unicode Hàn (漢) (Unihan) .

Ссылка на базу данных, которую я предоставил выше, показывает вам символы

8 голосов
/ 05 августа 2012

Вы можете использовать регулярное выражение для сопоставления с Поддерживаемыми именованными блоками :

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();
7 голосов
/ 23 февраля 2017

Как уже упоминалось несколько человек, в юникоде китайские, японские и корейские символы кодируются вместе, и существует несколько диапазонов. https://en.wikipedia.org/wiki/CJK_Compatibility

Для простоты, вот пример кода, который обнаруживает весь диапазон CJK:

public bool IsChinese(string text)
{
    return text.Any(c => (uint)c >= 0x4E00 && (uint)c <= 0x2FA1F);
}
3 голосов
/ 22 мая 2011

Просто проверьте символы, чтобы увидеть, находятся ли кодовые точки в нужном диапазоне. Например, см. Этот вопрос:

Каков полный диапазон китайских символов в Unicode?

1 голос
/ 14 апреля 2016

Согласно википедии (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) 
                )
0 голосов
/ 28 ноября 2016

Это сработало для меня:

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;
}
0 голосов
/ 05 мая 2016

в юникоде, китайские, японские и корейские символы кодируются вместе.

посетите этот FAQ: http://www.unicode.org/faq/han_cjk.html

Китайский иероглиф распределяется по нескольким блокам.

посетите эту вики: https://en.wikipedia.org/wiki/CJK_Unified_Ideographs

На сайте Юникод вы найдете несколько таблиц символов cjk.

Для простоты Вы можете просто использовать минимальный и максимальный диапазон китайских символов:

0x4e00 и 0x2fa1f для проверки.

0 голосов
/ 22 мая 2011

Вам необходимо запросить базу данных символов Unicode, которая содержит информацию о каждом символе Unicode.Вероятно, в C # есть служебная функция, которая может сделать это за вас.В противном случае вы можете скачать его из интернета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...