Java 和 C++ 之间的字符串大小关系
String size relation between java and C++
我正在开发一个基于 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