Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么java字符串将一些UTF-8符号视为几个字符_Java_String_Utf 8 - Fatal编程技术网

为什么java字符串将一些UTF-8符号视为几个字符

为什么java字符串将一些UTF-8符号视为几个字符,java,string,utf-8,Java,String,Utf 8,我试图涵盖utf-8符号,但java字符串有时会将一个符号转换为几个符号。将其写入文件并在编辑器中显示效果很好,但我需要检查有效的java标识符,这些标识符甚至可以用4个字节写入,例如“f0 93 81 98”,以便下一次使用: U+0080-U+07FF(110xxxxx 10xxxxxx) 字符串将其拆分为2个符号。 所以问题是如何从utf-8字节数组中获得正确的字符串。以下是我的代码示例: byte[] test = {0, 0}; int tmp;//use tmp in

我试图涵盖utf-8符号,但java字符串有时会将一个符号转换为几个符号。将其写入文件并在编辑器中显示效果很好,但我需要检查有效的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
                }
            }
        }
    }
byte[]test={0,0};
int tmp//使用tmp int避免负指针位混乱
对于(inta=12;a<14;a++){//110x掩码
对于(int b=0;b<16;b++){

tmp=aJava字符串对象是一系列的
char
,它们是UTF-16值。要处理所有Unicode,您需要查找
codePoint
构造函数和方法(使用
int
作为代码点的表示)

您的特定字符U+13058的UTF-16表示形式为0xD80C 0xDC58


至于如何将UTF-8字节转换为字符串的问题,Java标准库可以为您这样做,无论是直接调用字符串构造函数还是在构造InputStreamReader时。

您看到了吗?并非每个unicode代码点都可以用1
char
表示,因此您有时可以获得代理项对,如您所见因为一些UTF-8字符比普通字符(ASCII)占用更多的字节,这可能很有用:谢谢。这带来了一些启发,但对于我的代码,对于一些值,我仍然有2个代码点。
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