有没有其他方法可以知道java
String
是否包含UTF-8
编码的character-encoding
,例如阿拉伯语单词。
我尝试了这段代码:但它准确吗?能否达到目的?
char c = 'أ';
int num = (int) c;
if(num> 128)
// then UTF-8 characters exists
有没有其他方法可以知道java
String
是否包含UTF-8
编码的character-encoding
,例如阿拉伯语单词。
我尝试了这段代码:但它准确吗?能否达到目的?
char c = 'أ';
int num = (int) c;
if(num> 128)
// then UTF-8 characters exists
第一个平面(代码点U+0000到U+FFFF)包含最常用的字符,被称为基本多语言平面或BMP。UTF-16和UCS-2都将该范围内的有效代码点编码为单个16位代码单元,其数值等于相应的代码点。
Java(内部)始终使用UTF-16编码String
,而与其内容无关。http://docs.oracle.com/javase/6/docs/api/java/lang/String.html
您可以将其转换为任何支持的编码,包括ASCII和UTF-8,但可能会丢失在所选编码中无法显示的字符。
根据您检查的原因,您可以将字符串转换为ASCII并将其读回到Java String中,然后查看它们是否匹配。如果匹配,则ASCII足以存储您的字符串。这将是稍后阅读您源代码的读者最明显的检查。
您还可以将每个字符的Unicode代码点与128进行比较,如果它们都小于等于127,则该字符串与ASCII兼容,即肯定不包含阿拉伯语。要获取字符串中字符的Unicode代码点,请使用str.codePointAt(index)
。
如果您明确想要查找阿拉伯文本,您应该明确检查阿拉伯字符。否则,您可能会得到法语、德语或许多其他使用重音字符的语言的误报。幸运的是,Unicode联盟将每种语言关联到块中,因此检查可能归结为。cp >= beginningOfUnicodeBlock && cp <= endOfUnicodeBlock
编辑,由tchrist提示:有java.lang.Character.UnicodeBlock
和java.lang.Character.UnicodeScript
。后者在Java 7中添加。两者都可以用于分类Unicode代码点。
int cp = str.codePointAt(index);
if (UnicodeScript.ARABIC.equals(UnicodeScript.of(cp)) {
// arabic character found
}
char
变量。Unicode 代码点是 int
。 - tchristCharacter
和Pattern
类,或者只需使用ICU UCharacter
类,该类更适合这种工作。 - tchristCharacter.UnicodeScript
或在 1.2 中添加的 Character.UnicodeBlock
。 - user1252434我不相信有一种百分之百准确的方法来确定。UTF-8和UTF-16可以带有可选的字节顺序标记,您可以检测到它们。不能保证它会在那里,但是许多工具都包括它们,特别是对于UTF-16,因为它更重要。
Apache Commons IO包括一个方便的BOMInputStream类,用于读取带BOM标记的流,非常简单易用:
BOMInputStream bomIn = new BOMInputStream(in);
if (bomIn.hasBOM()) {
// has a UTF-8 BOM
}