Разделять только китайские символы в Java

Я фанат SQL DBDiff , который является инструментом с открытым исходным кодом, который можно использовать для сравнения таблиц, представлений, функций, пользователей и т. Д. Двух экземпляров баз данных SQL Server и генерирования изменений. скрипт между исходной и целевой базами данных.

7
задан israkir 4 November 2009 в 18:27
поделиться

2 ответа

Китайские символы находятся в определенных диапазонах Unicode:

  • 2F00-2FDF: Kangxi
  • 4E00-9FAF: CJK
  • 3400-4DBF: CJK Extension

Итак, все вы в основном необходимо проверить, находится ли кодовая точка символа в известных диапазонах. Этот пример является хорошей отправной точкой для написания синтаксического анализатора / разделителя на основе стека, вам нужно только расширить его, чтобы отделить цифры от латинских букв, что должно быть достаточно очевидным (подсказка: Character # isDigit () ):

Set<UnicodeBlock> chineseUnicodeBlocks = new HashSet<UnicodeBlock>() {{
    add(UnicodeBlock.CJK_COMPATIBILITY);
    add(UnicodeBlock.CJK_COMPATIBILITY_FORMS);
    add(UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS);
    add(UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT);
    add(UnicodeBlock.CJK_RADICALS_SUPPLEMENT);
    add(UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION);
    add(UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS);
    add(UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A);
    add(UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B);
    add(UnicodeBlock.KANGXI_RADICALS);
    add(UnicodeBlock.IDEOGRAPHIC_DESCRIPTION_CHARACTERS);
}};

String mixedChinese = "查詢促進民間參與公共建設法(210BOT法)";

for (char c : mixedChinese.toCharArray()) {
    if (chineseUnicodeBlocks.contains(UnicodeBlock.of(c))) {
        System.out.println(c + " is chinese");
    } else {
        System.out.println(c + " is not chinese");
    }
}

Удачи.

10
ответ дан 6 December 2019 в 21:16
поделиться

Вот подход, который я бы выбрал.

Вы можете использовать Character.codePointAt (char [] charArray, int index), чтобы вернуть значение Unicode для char в вашем массиве char.

] Вам также понадобится отображение латинских символов Unicode.

Если вы посмотрите в исходный код Character.UnicodeBlock, полный блок LATIN представляет собой интервал [0x0000, 0x0249]. По сути, вы проверяете, находится ли ваша кодовая точка Unicode где-то в пределах этого интервала.

Я подозреваю, что есть способ просто использовать Character.Subset, чтобы проверить, содержит ли он ваш char, но я не изучал это.

]
1
ответ дан 6 December 2019 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: