我正在尝试覆盖utf-8符号,但java String有时会将1个符号转换为几个符号。将它写入文件并在编辑器中显示效果很好,但我需要检查有效的java标识符,即使是4个字节也可以写入,例如“ f0 93 81 98 ”,用于下一个diapason:
U + 0080-U + 07FF(110xxxxx 10xxxxxx)
String将其拆分为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
}
}
}
}
答案 0 :(得分:1)
Java String对象是char
的序列,它们是UTF-16值。要处理所有Unicode,您需要查找codePoint
构造函数和方法(使用int
作为代码点的表示)。
byte[] b = new byte[]{
(byte)0xf0, (byte)0x93, (byte)0x81, (byte)0x98};
String s = new String(b, "UTF-8");
System.out.println(s.length()); // 2
System.out.println(s.codePoints().count()); // 1
您的特定字符U + 13058的UTF-16表示形式为0xD80C 0xDC58。
关于如何将UTF-8字节转换为String的问题,Java标准库可以为您做到这一点,无论是直接调用String构造函数还是构造InputStreamReader。