为什么java String将某些UTF-8符号视为多个字符

时间:2018-01-24 12:54:04

标签: java string utf-8

我正在尝试覆盖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
                }
            }
        }
    }

1 个答案:

答案 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。