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

时间:2012-05-07 06:52:22

标签: java c++ string

我正在开发基于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的原因。

3 个答案:

答案 0 :(得分:2)

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

因此,在C ++端需要4个字节,即4 char s来存储单个Java字符,C ++中以char表示的字符串以空值终止(最后一个字符必须是{{1 }}),所以'\0'

答案 1 :(得分:2)

如果字符串是通过UTF-8翻译的,则每个字符可以变成4个字节。如果你超出保留的内存,CPP不提供任何保护,你必须采用最差的大小,即使你不相信你每个人都会使用这些字符。

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

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

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

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

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

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

答案 2 :(得分:1)

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