文字列が英語かアラビア語かを判断する方法はありますか?
8 に答える
これが私が試したばかりの単純なロジックです:
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;
}
アラビア語のUnicodeコードポイントがテキストに見つかった場合にのみ、テキストをアラビア語として宣言します。このロジックを拡張して、ニーズにより適したものにすることができます。
範囲0600〜06E0は、アラビア文字および記号のコードポイント範囲です(Unicodeテーブルを参照) 。
Java自体はUnicodeによるさまざまな言語チェックをサポートしており、アラビア語もサポートされています。同じことを行うためのはるかに簡単で最小の方法は、UnicodeBlockによるものです
public static boolean textContainsArabic(String text) {
for (char charac : text.toCharArray()) {
if (Character.UnicodeBlock.of(charac) == Character.UnicodeBlock.ARABIC) {
return true;
}
}
return false;
}
すべてのアラビア文字と記号の範囲をカバーするためのマイナーな変更
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;
}
通常、文字列自体のコードポイントでわかります。アラビア語は、Unicodeコードスペースの特定のブロックを占めています。
これらのブロック(などبلدي الحوامات مليء الثعابينة
)にかなりの割合の文字が存在する場合、それはアラビア語のテキストであるというのはかなり安全な賭けです。
この答えはやや正しいです。しかし、ペルシア語と英語の文字を組み合わせると、 TRUE!が返されますが、これは正しくありません。ここでは、同じメソッドを変更して、うまく機能するようにしました
public static boolean isProbablyArabic(String s) {
for (int i = 0; i < s.length();) {
int c = s.codePointAt(i);
if (!(c >= 0x0600 && c <= 0x06E0))
return false;
i += Character.charCount(c);
}
return true;
}
Nグラムベースのテキスト分類(そのフレーズのグーグル)を使用することもできますが、これは失敗を防ぐ手法ではなく、短すぎない文字列が必要になる場合があります。
また、ASCII文字のみの文字列はアラビア語ではないと判断する場合もあります。
英語の文字は、次の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; } else { onlyEnglish = false; } } return onlyEnglish; }
これを試して :
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;
}