Java: как проверить, принадлежит ли символ определенному блоку Unicode?

Мне нужно определить, к какому естественному языку принадлежит мой вход. Цель состоит в том, чтобы различать слова на арабском и английском языках на смешанном входе, где вход является Unicode и извлекается из текстовых узлов XML. Я заметил класс Character.UnicodeBlock. Это связано с моей проблемой? Как я могу заставить его работать?

Edit:   Подход Character.UnicodeBlock был полезен для арабского языка, но, по-видимому, он не делает его для английского (или других европейских языков), потому что блок BASIC_LATIN Unicode охватывает символы и символы, не подлежащие печати, а также буквы. Итак, теперь я использую метод matches() объекта String с выражением regex "[A-Za-z]+". Я могу жить с ним, но, возможно, кто-то может предложить более удобный и быстрый способ.

Ответы

Ответ 2

Если [A-Za-z]+ соответствует вашему требованию, вы не найдете ничего быстрее или красивее. Однако, если вы хотите совместить все буквы в блоке Latin1 (включая буквы с акцентом и лигатуры), вы можете использовать это:

Pattern p = Pattern.compile("[\\pL&&\\p{L1}]+");

Это пересечение множества всех букв Unicode и набора всех символов Latin1.

Ответ 4

У вас есть обратная проблема этого, но по иронии судьбы, что не работает для него, это просто отлично работает для вас. Это просто искать слова на английском языке (только ASCII-совместимые символы) с reg-exp "\ w".

Ответ 5

Английские символы, как правило, находятся в этих 4 блоках Unicode:

ArrayList<Character.UnicodeBlock> english = new ArrayList<>();
english.add(Character.UnicodeBlock.BASIC_LATIN);
english.add(Character.UnicodeBlock.LATIN_1_SUPPLEMENT);
english.add(Character.UnicodeBlock.LATIN_EXTENDED_A);
english.add(Character.UnicodeBlock.GENERAL_PUNCTUATION);

Итак, если у вас есть String, вы можете перебрать все символы и посмотреть, что Unicode блокирует каждый символ:

for (char currentChar : myString.toCharArray())  
{
    Character.UnicodeBlock unicodeBlock = Character.UnicodeBlock.of(currentChar);
    if (english.contains(unicodeBlock))
    {
        // This character is English
    }
}

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

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

Существуют и другие способы определения фактического естественного языка. Библиотеки, такие как langdetect, которые я использовал с большим успехом, могут сделать это для вас:

https://code.google.com/p/language-detection/

Ответ 6

Английские символы, как правило, находятся в этих 4 блоках Unicode:

  • BASIC_LATIN
  • LATIN_1_SUPPLEMENT
  • LATIN_EXTENDED_A
  • GENERAL_PUNCTUATION

    public static boolean isEnglish(String text) {
    
     boolean onlyEnglish = false;
    
     for (char character : text.toCharArray()) {
    
        if (Character.UnicodeBlock.of(character) == Character.UnicodeBlock.BASIC_LATIN
                || Character.UnicodeBlock.of(character) == Character.UnicodeBlock.LATIN_1_SUPPLEMENT
                || Character.UnicodeBlock.of(character) == Character.UnicodeBlock.LATIN_EXTENDED_A
                || Character.UnicodeBlock.of(character) == Character.UnicodeBlock.GENERAL_PUNCTUATION) {
    
            onlyEnglish = true;
        }
     }
    
      return onlyEnglish;
    }