小编Rol*_*olf的帖子

在Java JNI中获取真正的UTF-8字符

有一种简单的方法可以在JNI代码中将Java字符串转换为真正的UTF-8字节数组吗?

不幸的是,GetStringUTFChars()几乎完成了所需的但不完全的,它返回一个"修改的"UTF-8字节序列.主要区别在于修改后的UTF-8不包含任何空字符(因此您可以将其视为ANSI C空终止字符串),但另一个区别似乎是如何处理诸如表情符号之类的Unicode补充字符.

诸如U + 1F604"具有开口和微笑眼睛的微笑"之类的字符存储为代理对(两个UTF-16字符U + D83D U + DE04)并且具有4字节UTF-8等效于F0 9F 98 84,这是我在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));
Run Code Online (Sandbox Code Playgroud)

上面的代码打印以下内容:

c [0] = 0xd83d c [1] = 0xde04 b [0] = 0xf0 b [1] = 0x9f b [2] = 0x98 b [3] = 0x84

但是,如果我将's'传递给本机JNI方法并调用GetStringUTFChars(),我得到6个字节.每个代理对字符都被独立地转换为3字节序列:

JNIEXPORT void JNICALL Java_EmojiTest_nativeTest(JNIEnv *env, jclass …
Run Code Online (Sandbox Code Playgroud)

java java-native-interface encoding utf-8

18
推荐指数
1
解决办法
9477
查看次数

在Mac OS X上更改默认的g ++架构?

使用Mac OS X 10.6 Apple更改了g ++的默认目标,因此它生成64位而不是32位代码.我知道我可以在命令行中指定"-arch i386",但有没有办法通过环境变量或类似的方式全局更改默认架构?(我一直在收到链接错误,因为我遇到了真正的问题,需要在我正在移植的项目中指定所需的所有位置.)

c++ macos

5
推荐指数
1
解决办法
7204
查看次数

使用 Nashorn 迭代数组

使用 java 的内置 javascript 解释器时,为什么我可以使用 Arrays.forEach() 迭代 java List 而不是本机数组?我有以下测试代码

var ArrayList = Java.type('java.util.ArrayList');
var list = new ArrayList();
list.add('a');
list.add('b');
list.add('c');

var StringArray = Java.type("java.lang.String[]");
var array = new StringArray(3);
array[0] = "A";
array[1] = "B";
array[2] = "C";

list.forEach(function(v) { print(v); });
array.forEach(function(v) { print(v); });
Run Code Online (Sandbox Code Playgroud)

我希望打印出来

美国广播公司

但我得到了

美国广播公司

类型错误:[Ljava.lang.String;@644e4fbf 在第 14 行没有这样的函数“forEach”

以下工作,但为什么不 array.forEach() ?

for (var i=0; i<array.length; ++i)
  print(array[i]);
Run Code Online (Sandbox Code Playgroud)

我的问题是我的 javascript 代码想要调用大量返回 String[] 的 java 函数,并且我想处理结果对象,就好像是一个常规的 javascript 数组一样。有没有比在java中编写大量包装函数来将我的数组转换为ArrayList更简单的方法来解决这个问题?

javascript java arrays nashorn

2
推荐指数
1
解决办法
4205
查看次数