1

我有一个带有 Unicode 字符的 Java 字符串文字,需要将其转换为 C 字符串文字,可以使用JNIEnv.NewString.

unsigned short不幸的是,上述方法需要一个指向(jchar)数组的指针。我尝试使用如下代码:

unsigned short str[] = {65, 66, 67};
jstring java_str = (*env)->NewString(env, str, 3);

然而,这需要很多空间,不可读,并且难以维护。

有没有办法将字符串文字转换为unsigned short[]C 中的 a,同时仍然能够使用 Java 的 UTF-16 字符?

这种转义可以以编程方式完成吗?即将a转换java.lang.String为可以在C 源代码中使用的字符串文字。

4

2 回答 2

2

如果您可以使用 C11 和 GCC,则可以char16_t在 GCC 中使用新的 UTF-16:

#include <uchar.h>

#ifndef __STDC_UTF_16__
#error "char16_t not UTF-16"
#endif

...
    char16_t my_string[] = u"abc";
    jstring java_str = (*env)->NewString(env, str, 3);

并编译gcc -std=c11

但无论如何,大多数时候人们只使用 ASCII 字符串,为此可以简单地使用

jstring java_str = (*env)->NewStringUTF(env, "abc");

这将假定字符串采用修改后的 UTF-8 编码(即 UTF-16 代理对分别编码为 UTF-8;并以空字符结尾)。由于 ASCII 是 UTF-8 的一个子集,这对于 ASCII 字符串相当有用。

于 2017-02-25T20:20:27.047 回答
1

您正在寻找的东西不称为转义。

看来您想要做的是使用人类可读的字符串文字在 C 中指定一个字符串,并能够将其传递给 JNI NewString()

你将不得不继续阅读wchar_t

请参阅什么是 C 语言中的“宽字符串”?https://en.wikibooks.org/wiki/C_Programming/C_Reference/wchar.h

您需要做的是将您的字符串文字定义为wchar_t(使用上述帖子中解释的“L”符号),然后编写一个转换函数,将这些数组转换wchar_tjchar.

不幸的是,C 标准没有定义 的精确实现wchar_t,而是让 C 编译器供应商随心所欲,因此您的 C 编译器可能不会将wchar_t其视为 16 位数量。在这种情况下,您的转换函数将无法简单地将数组wchar_t转换为数组jchar,而是必须一个一个地转换它们。这有点麻烦,但可行。祝你好运!

于 2017-02-25T20:18:24.747 回答