了解java字符串中包含的文本是否包含UTF-8编码字符的最佳方法

时间:2012-03-22 15:35:17

标签: java encoding character-encoding

有没有其他方法可以知道java String是否包含character-encoding编码中的UTF-8,例如阿拉伯语单词。

我试过这段代码:但是它准确无误吗?

char c = 'أ';
int num = (int) c;

if(num> 128)
// then UTF-8 characters exists 

3 个答案:

答案 0 :(得分:2)

(假设UTF-8 ==非ASCII)

您可以做的是编码然后解码ASCII中的字符串并将其结果与原始字符进行比较。如果它们不相等,则存在非ASCII字符。

但是,您自己的示例也会起作用(几乎应该是>= 128),因为以下证明确实所有char s < 128都是ASCII:

  

为了实现向后兼容性,128个ASCII和256个ISO-8859-1(拉丁语1)字符被分配了Unicode / UCS代码点,这些代码点与早期标准中的代码相同。

  

第一个平面(代码点U + 0000到U + FFFF)包含最常用的字符,称为基本多语言平面或BMP。 UTF-16和UCS-2都将此范围内的有效代码点编码为单个16位代码单元,在数字上等于相应的代码点。

(“UTF-16”和“ASCII”,维基百科)

char是UTF-16“代码单元”。


但是,从整个问题来看,你可能最好先阅读The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

答案 1 :(得分:1)

Java(内部)始终以UTF-16编码String,与其内容无关。 http://docs.oracle.com/javase/6/docs/api/java/lang/String.html

您可以将其转换为任何支持的编码,包括ASCII和UTF-8,但可能会丢失在所选编码中无法显示的字符。

根据您检查的原因,您可以将字符串转换为ASCII并将其读回java字符串并查看它们是否匹配。如果是这样,ASCII就足以存储你的字符串。对于后来的源代码读者来说,这将是最明显的检查。

您还可以将每个字符的unicode代码点与128进行比较,如果它们都是&lt; = 127,则字符串与ASCII兼容,即肯定不包含阿拉伯语。要获取字符串字符的unicode代码点,请使用str.codePointAt(index)

如果您明确要查找阿拉伯语文本,则应明确检查阿拉伯语字符。否则,您可能会对法语,德语或许多其他使用重音字符的语言产生误报。幸运的是,Unicode联盟将每种语言的块关联起来,因此检查可能归结为 cp >= beginningOfUnicodeBlock && cp <= endOfUnicodeBlock

tchrist暗示的

修改:有java.lang.Character.UnicodeBlockjava.lang.Character.UnicodeScript。后者在Java 7中添加。两者都可用于对unicode代码点进行分类。

int cp = str.codePointAt(index);
if (UnicodeScript.ARABIC.equals(UnicodeScript.of(cp)) {
    // arabic character found
}

答案 2 :(得分:-1)

我不相信有一种明确的方法可以100%准确地知道。 UTF-8和UTF-16可以附带一个可以检测到的可选Byte Order Mark。不能保证它会存在,但很多工具都包括它们,特别是对于UTF-16,因为它更重要。

Apache Commons IO包含一个方便的BOMInputStream class,用于读取BOM标记的流,易于使用:

BOMInputStream bomIn = new BOMInputStream(in);
if (bomIn.hasBOM()) {
    // has a UTF-8 BOM
}