为什么java字符串将一些UTF-8符号视为几个字符
我试图涵盖utf-8符号,但java字符串有时会将一个符号转换为几个符号。将其写入文件并在编辑器中显示效果很好,但我需要检查有效的java标识符,这些标识符甚至可以用4个字节写入,例如“f0 93 81 98”,以便下一次使用: U+0080-U+07FF(110xxxxx 10xxxxxx) 字符串将其拆分为2个符号。 所以问题是如何从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
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代码点都可以用1char
表示,因此您有时可以获得代理项对,如您所见因为一些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