有没有其他方法可以知道java
String
是否包含character-encoding
编码中的UTF-8
,例如阿拉伯语单词。
我试过这段代码:但是它准确无误吗?
char c = 'أ';
int num = (int) c;
if(num> 128)
// then UTF-8 characters exists
答案 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
修改:有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
}
答案 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
}