我正在使用 UTF-8 BOM 编码获取希伯来语和阿拉伯语的 txt 文件。我需要根据内容将它们转换为 Windows-1255 或 Windows-1256。
在运行时,我如何知道要使用的正确编码?
Mosilla UniversalDetector 和我找到的任何其他解决方案都没有运气。有任何想法吗?(我需要用 Java 6 来做。不要问为什么......)
我正在使用 UTF-8 BOM 编码获取希伯来语和阿拉伯语的 txt 文件。我需要根据内容将它们转换为 Windows-1255 或 Windows-1256。
在运行时,我如何知道要使用的正确编码?
Mosilla UniversalDetector 和我找到的任何其他解决方案都没有运气。有任何想法吗?(我需要用 Java 6 来做。不要问为什么......)
从 java 1.7 开始,Character 类知道像阿拉伯语和希伯来语这样的 Unicode 脚本。
int freqs = s.codePoints().map(cp ->
Character.UnicodeScript.of(cp) == Character.UnicodeScript.ARABIC ? 1
: Character.UnicodeScript.of(cp) == Character.UnicodeScript.HEBREW ? -1
: 0).sum();
对于 java 1.6,方向性可能就足够了,因为有 RIGHT_TO_LEFT 和 RIGHT_TO_LEFT_ARABIC:
String s = "אבגדהאבגדהصضطظع"; // First Hebrew, then Arabic.
int i0 = 0;
for (int i = 0; i < s.length(); ) {
int codePoint = s.codePointAt(i);
i += Character.charCount(codePoint);
boolean rtl = Character.getDirectionality(codePoint)
== Character.DIRECTIONALITY_RIGHT_TO_LEFT;
boolean rtl2 = Character.getDirectionality(codePoint)
== Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC;
System.out.printf("[%d - %d] '%s': LTR %s %s%n",
i0, i, s.substring(i0, i), rtl, rtl2);
i0 = i;
}
[0 - 1] 'א': LTR true false
[1 - 2] 'ב': LTR true false
[2 - 3] 'ג': LTR true false
[3 - 4] 'ד': LTR true false
[4 - 5] 'ה': LTR true false
[5 - 6] 'א': LTR true false
[6 - 7] 'ב': LTR true false
[7 - 8] 'ג': LTR true false
[8 - 9] 'ד': LTR true false
[9 - 10] 'ה': LTR true false
[10 - 11] 'ص': LTR false true
[11 - 12] 'ض': LTR false true
[12 - 13] 'ط': LTR false true
[13 - 14] 'ظ': LTR false true
[14 - 15] 'ع': LTR false true
所以
int arabic(String s) {
int n = 0;
for (char ch : s.toCharArray()) {
if (Character.getDirectionality(codePoint)
== Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC) {
++n;
if (n > 1000) {
break;
}
}
}
return n;
}
int hebrew(String s) {
int n = 0;
for (char ch : s.toCharArray()) {
if (Character.getDirectionality(codePoint)
== Character.DIRECTIONALITY_RIGHT_TO_LEFT) {
++n;
if (n > 1000) {
break;
}
}
}
return n;
}
if (arabic(s) > 0) {
return "Windows-1256";
} else if (hebrew(s) > 0) {
return "Windows-1255";
} else {
return "Klingon-1257";
}