【问题标题】:How to create UTF16 string in JNI for Java from C/C++?如何从 C/C++ 在 JNI for Java 中创建 UTF16 字符串?
【发布时间】:2019-11-07 10:13:04
【问题描述】:

我有一个带有笑脸的 C/C++ char* 字符串????但其余内容为 ASCII。例如,Hello World ????

当我尝试使用 NewStringUTFNewString 在 JNI 中创建 Java 字符串时,行为未定义。

创建 Java 字符串的正确方法是什么?

【问题讨论】:

  • @KiriSakow 检查它为什么?这个问题是关于相反的操作。
  • 笑脸是如何编码的? (使用了哪些实际字节)在 UTF-8 编码中,它应该是序列f0 9f 98 8d(4 个字节)你所说的“行为未定义”是什么意思?你如何测试这个?
  • 我能够解决它。 char* 指向真正的 UTF-8 数据,而不是经过修改的 UTF-8 数据。因此,我手动将 UTF-8 解码为 UTF-16,然后将其传递给 JNI NewString() 函数。
  • 您可以将此作为(自我)答案发布吗?这可能对其他人有用。

标签: java c++ java-native-interface


【解决方案1】:

我所拥有的 char* 指向真正的 UTF-8 数据,而不是 修改后的 UTF-8 数据。因此,我先将字符串转换为 UTF-16,然后使用 NewString 生成 Java 字符串。 为了将 UTF-8 转换为 UTF-16,我使用了this library

string line = myStringWithSmiley;
u16string utf16line = utf8::utf8to16(line);
return env->NewString((const jchar*)(utf16line.c_str()), utf16line.length());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-06
    • 2012-07-08
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多