Как определить строку на английском или арабском?
Есть ли способ определить строку на английском или арабском?
Ответы
Ответ 1
Вот простая логика, которую я только что пробовал:
public static boolean isProbablyArabic(String s) {
for (int i = 0; i < s.length();) {
int c = s.codePointAt(i);
if (c >= 0x0600 && c <= 0x06E0)
return true;
i += Character.charCount(c);
}
return false;
}
Он объявляет текст как арабский, если и только если в тексте найдена арабская кодовая точка юникода. Вы можете улучшить эту логику, чтобы быть более подходящей для ваших нужд.
Диапазон 0600 - 06E0 - это диапазон кодовых точек арабских символов и символов (см. Таблицы Unicode)
Ответ 2
Java сама по себе поддерживает различные проверки языка по юникоду, поддерживается арабский язык. Гораздо проще и наименьший способ сделать то же самое - UnicodeBlock
public static boolean textContainsArabic(String text) {
for (char charac : text.toCharArray()) {
if (Character.UnicodeBlock.of(charac) == Character.UnicodeBlock.ARABIC) {
return true;
}
}
return false;
}
Ответ 3
Небольшое изменение, чтобы охватить все арабские символы и диапазон символов
private boolean isArabic(String text){
String textWithoutSpace = text.trim().replaceAll(" ",""); //to ignore whitepace
for (int i = 0; i < textWithoutSpace.length();) {
int c = textWithoutSpace.codePointAt(i);
//range of arabic chars/symbols is from 0x0600 to 0x06ff
//the arabic letter 'لا' is special case having the range from 0xFE70 to 0xFEFF
if (c >= 0x0600 && c <=0x06FF || (c >= 0xFE70 && c<=0xFEFF))
i += Character.charCount(c);
else
return false;
}
return true;
}
Ответ 4
Обычно вы можете указывать кодовые точки внутри самой строки. Арабский занимает определенные блоки в кодовом пространстве Unicode.
Это довольно безопасная ставка, что если значительная часть символов существует в этих блоках (например, بلدي الحوامات مليء الثعابينة
), это арабский текст.
Ответ 5
Вы можете использовать категоризацию текста на основе N-грамм (google для этой фразы), но она не является отказоустойчивой техникой и может потребовать не слишком короткую строку.
Вы также можете решить, что строка с буквами ASCII не является арабским.
Ответ 6
Английские символы, как правило, находятся в этих 4 блоках Unicode:
Ответ 7
Попробуйте следующее:
internal static bool ContainsArabicLetters(string text)
{
foreach (char character in text.ToCharArray())
{
if (character >= 0x600 && character <= 0x6ff)
return true;
if (character >= 0x750 && character <= 0x77f)
return true;
if (character >= 0xfb50 && character <= 0xfc3f)
return true;
if (character >= 0xfe70 && character <= 0xfefc)
return true;
}
return false;
}