Java: как проверить, принадлежит ли символ определенному блоку юникода? - PullRequest
15 голосов
/ 01 января 2009

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

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

Ответы [ 5 ]

18 голосов
/ 01 января 2009

Да, вы можете просто использовать Character.UnicodeBlock.of (char)

5 голосов
/ 04 января 2009

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

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

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

1 голос
/ 07 октября 2015

Свойство Unicode Script , вероятно, более полезно. В Java его можно найти с помощью java.lang.Character.UnicodeScript класса:

Character.UnicodeScript script = Character.UnicodeScript.of(c);
1 голос
/ 03 октября 2015

Английские символы обычно находятся в этих 4 блоках Юникода:

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);

Так что, если у вас есть строка, вы можете перебрать все символы и посмотреть, в каком блоке Юникода находится каждый символ:

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/

0 голосов
/ 03 января 2009

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

...