3

我正在开发基于 Java 构建的某个应用程序。Java 层与 C++ 层对话,后者执行从数据库形成 sql 查询的逻辑并将结果返回给 Java 层。

用一个更简单的例子:

在Java方面

nameField = new JTextField(20) //20 chars max length
name = t.getText() // name is sent to CPP layer

在 CPP 层上,接收来自 java 层的名称并将其存储在局部变量中,例如 cppName。我对 CPP 层中使用的变量声明感到困惑。他们中的大多数是这样声明的:

char cppName[20*4+1]

我想知道这里20*4+1的意义。在 cpp 端声明所有变量大小为 javaSize*4+1 的原因。

4

3 回答 3

2

java代码中的字符是UNICODE吗?如果是这样,单个char不足以存储 UNICODE 字符,则比率为4:1. 最后一个字符 (+1) 是空终止符。

所以在 C++ 端需要 4 个字节,也就是 4 个字节char来存储单个 Java 字符,而 C++ 中以 char 表示的字符串是以空字符结尾的(最后一个字符必须是'\0'),所以20*4+1.

于 2012-05-07T06:55:18.720 回答
2

如果通过 UTF-8 翻译字符串,则每个字符都可以变成 4 字节。由于如果您超出保留的内存,CPP 不提供任何保护,因此您必须采用最坏情况的大小,即使您不相信自己会使用这些字符。

BTW 在 Java 中字符串存储为 UTF-16,这意味着它支持 65535 以上的字符作为使用两个字符的代码点。

http://java.sun.com/developer/technicalArticles/Intl/Supplementary/

Java 中支持的代码点的最长字符在 UTF-8 编码时变为 4 个字节。

StringBuilder sb = new StringBuilder();
sb.appendCodePoint(Character.MAX_CODE_POINT);
System.out.println(sb.toString().getBytes("UTF-8").length); // prints 4

尽管这在技术上占用了char字符串中的两个。如果你取最大的字符,你会得到 3。所以真的 4 过于保守(因为需要两个字符才能产生 4 个字节)

StringBuilder sb = new StringBuilder();
sb.appendCodePoint(Character.MAX_VALUE);
System.out.println(sb.toString().getBytes("UTF-8").length); // prints 3
于 2012-05-07T06:59:31.670 回答
1

Java 字符是 unicode,因此如果您想将它们作为 ascii 传递给 C,您将不得不使用 string.getBytes(charset()) - 将为您提供所需字符集的字节数组。在 C 端,您将不得不添加终止空字节 - 因此 +1

于 2012-05-07T06:57:11.003 回答