1

我想避免在转换过程中进行字符串转换。因为它很慢。我建议在内部 V8String和 Javajstring是相同的宽字符序列,所以也许可以在不解码/编码的情况下进行复制,或者甚至完全避免复制?

v8::String::Value v8_text(args[1]); // get the v8 string from arguments
wchar_t* w_chars = (wchar_t*)(*v8_text);
jstring j_text = (Env)->NewString((jchar*)w_chars, v8_text.length());

以上已经是最有效的方法了吗?

比你

4

1 回答 1

0

给定一些假设,你是对的。

Java 字符串是 Unicode 字符的 UTF-16 编码的代码单元的计数序列。字节序是为了匹配操作系统的默认值。

JavaScript 字符串是16 位无符号整数的计数序列。

V8 不会将数据转换为字符串,除非您调用这样做的函数(即,转换为 ASCII 或 UTF-8)。

因此,如果您的输入实际上是具有 UTF-16 编码且具有预期字节顺序的 Unicode 字符串,那么您提供的代码将起作用并且应该是最有效的。

然而,

wchar_t* w_chars = (wchar_t*)(*v8_text);

有点误导,因为wchar_t它的大小取决于实现。最终,您只想将指针转换为jchar *so,如果这一步是必要的,我建议char16_t *或者uint16_t *相反,因为它们表达了这样的假设,即数据是按字节顺序排列的 2 字节块。

于 2013-06-07T15:48:33.917 回答