在 Java JNI 中获取真正的 UTF-8 字符
有没有一种简单的方法可以在JNI代码中将Java字符串转换为真正的UTF-8字节数组?
不幸的是,GetStringUTFChars()几乎可以完成所需的操作,但并不完全是,它返回一个“修改的”UTF-8字节序列。主要区别在于修改后的 UTF-8 不包含任何空字符(因此您可以处理 ANSI C 空终止字符串),但另一个区别似乎是如何处理 Unicode 增补字符(如表情符号)。
诸如U + 1F604“张开嘴巴和微笑的眼睛的笑脸”之类的字符被存储为代理项对(两个UTF-16字符U + D83D U + DE04),并且具有相当于F0 9F 98 84的4字节UTF-8,如果我在Java中将字符串转换为UTF-8,则这是我得到的字节序列:
char[] c = Character.toChars(0x1F604);
String s = new String(c);
System.out.println(s);
for (int i=0; i<c.length; ++i)
System.out.println("c["+i+"] = 0x"+Integer.toHexString(c[i]));
byte[] b = s.getBytes("UTF-8");
for (int i=0; i<b.length; ++i)
System.out.println("b["+i+"] = 0x"+Integer.toHexString(b[i] & 0xFF));
上面的代码打印以下内容: