3

Java で構築された特定のアプリケーションに取り組んでいます。Java レイヤーは、データベースから SQL クエリを形成するロジックを実行する C++ レイヤーと通信し、結果を 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 の意味を知りたいです。javaSize*4+1 のサイズで cpp 側のすべての変数を宣言する理由。

4

3 に答える 3

2

文字列が UTF-8 で変換される場合、各文字は 4 バイトに変換できます。予約されたメモリをオーバーランした場合、CPP は保護を提供しないため、これらの文字をすべて使用するとは思わない場合でも、最悪の場合のサイズを使用する必要があります。

ところで、Java String は UTF-16 として格納されます。つまり、2 つの文字を使用するコード ポイントとして 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には文字列で 2 つ必要です。最大の文字を取得すると、3 になります。したがって、実際には 4 は過度に保守的です (4 バイトを作成するには 2 文字かかるため)。

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 に答える
2

Java コードの文字は UNICODE ですか? もしそうなら、単一charでは UNICODE 文字を格納するには不十分です。比率は4:1です。最後の文字 (+1) はヌル ターミネータです。

charしたがって、単一の Java 文字を格納するには、C++ 側で4 バイト (4 s) が必要であり、C++ の文字表現の文字列は null で終了します (最後の文字は である必要があります'\0') 20*4+1

于 2012-05-07T06:55:18.720 に答える
1

Java 文字は Unicode であるため、ASCII として C に渡したい場合は、string.getBytes(charset()) を使用する必要があります。これにより、目的の文字セットのバイト配列が得られます。C側では、終端のヌルバイトを追加する必要があります-したがって+1

于 2012-05-07T06:57:11.003 に答える