Java 和 C++ 之间的字符串大小关系

String size relation between java and C++

本文关键字:关系 字符串 C++ 之间 Java      更新时间:2023-10-16

我正在开发一个基于 Java 构建的应用程序。java层与C++层通信,该层执行从数据库形成SQL查询的逻辑,并将结果返回给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。

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

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

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

顺便说一句,在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

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