【发布时间】:2018-01-24 12:54:03
【问题描述】:
我试图涵盖 utf-8 符号,但 java String 有时会将 1 个符号转换为多个符号。将其写入文件并在编辑器中显示效果很好,但我需要检查有效的 java 标识符,这些标识符甚至可以写成 4 个字节,例如下一个音调的“f0 93 81 98”:
U+0080-U+07FF (110xxxxx 10xxxxxx)
字符串将其拆分为 2 个符号。 所以问题是如何从 utf-8 字节数组中获取正确的字符串。这是我的代码示例:
byte[] test = {0, 0};
int tmp;//use tmp int to avoid negative pointer bit mess
for (int a = 12; a < 14; a++) {//110x mask
for (int b = 0; b < 16; b++) {
tmp = a << 4;
tmp |= b;
test[0] = (byte) tmp;
for (int c = 8; c < 14; c++) {//10xx mask
for (int d = 0; d < 16; d++) {
tmp = c << 4;
tmp |=d;
test[1] = (byte) tmp;
String symbol = new String(test, "UTF-8");
System.out.println(symbol.codePoints().count());//as Josh Lee commented
}
}
}
}
【问题讨论】:
-
并非每个 unicode 代码点都可以用 1 个
char表示,因此您有时可以获得代理对,就像您看起来的那样。 -
因为一些 UTF-8 字符比普通字符(ASCII)占用更多字节