9

作成中の文字列があり、その文字列に複数の "\0" (null) 文字を追加する必要があります。各ヌル文字の間には、他のテキスト データ (ASCII 英数字のみ) があります。

私の問題は、J2SE で最初の null (\0) を追加すると、Java はそれが文字列ターミネータ (C++ と同様) であると判断し、追加される他のすべてのデータを無視するように見えることです。エラーは発生せず、末尾のデータは無視されます。文字列の null の後に追加の後続データを強制する必要があります。サポートしているレガシーデータベースに対してこれを行う必要があります。

%00 のようなものが文字列の動作の解釈をだますことを期待して、文字列をエンコード/デコードしようとしましたが、文字列を再エンコードすると、Java は再び null 文字を認識し、最初の null の後のすべてのデータを削除します。

更新: 関連するコード スニペットは次のとおりです。はい、使用しようとしていますStrings。文字を試すつもりですが、データベースに文字列として保存する必要があるため、同じ問題が発生する可能性があります。

いくつかの背景。「\n」を含む HTTP ポスト経由でデータを受信して​​います。改行を削除して「\0」に置き換える必要があります。" debug" メソッドは単純なメソッドですSystem.out.println

                String[] arrLines = sValue.split("\n");
                for(int k=0;k<arrLines.length;k++) {
                    if (0<k) {
                        sNewValue += "\0";
                    }
                    sNewValue+= arrLines[k];
                    debug("New value =" + sNewValue);
                }

文字列である sNewValue はデータベースにコミットされ、文字列として実行する必要があります。sNewValueコンソールで各反復後に現在の値を表示するときに観察しているのは、次のようなものです。

入力は値1です\n値2\n値3 コンソールの出力は、このコードから私を与えています

value1
value1
value1

私は期待している

value1
value1 value2
value1 value2 value3 

value1、value2、および value3 の間にそれぞれ印刷不可能な null があります。実際にデータベースに保存される値も「value1」であることに注意してください。つまり、コンソールの表示だけの問題ではありません。\0 以降のデータは無視されています。

4

4 に答える 4

15

これは文字列自体のテキストとは何の関係もないのではないかと強く思います。それが表示されている方法にすぎないと思います。たとえば、次のことを試してください。

public class Test {
    public static void main(String[] args) {
        String first = "first";
        String second = "second";
        String third = "third";
        String text = first + "\0" + second + "\0" + third;
        System.out.println(text.length()); // Prints 18
    }
}

これは18を印刷し、すべての文字が存在することを示します。ただし、textUIラベルで表示しようとすると、。だけが表示されても驚かないでしょうfirst。(同じことがかなり弱いデバッガーにも当てはまる可能性があります。)

同様に、次を使用できるはずです。

 char c = text.charAt(7);

そして今は「2番目」の2番目の文字であるcはずです。'e'

基本的に、JavaのコアにはU+0000が含まれているという事実をまったく気にしないと思います。Javaに関する限り、これは単なる別の文字です。問題を引き起こす可能性が高いのは、ネイティブコード(ディスプレイなど)との境界でのみです。

これで問題が解決しない場合は、観察した内容を正確に説明してください。残りのデータが追加されていないと思われる理由を説明してください。

編集:別の診断アプローチは、文字列内の各文字のUnicode値を出力することです。

for (int i = 0; i < text.length(); i++) {
    System.out.println((int) text.charAt(i));
}
于 2011-12-24T09:48:49.677 に答える
2

char[]代わりにorを使用することをお勧めしますList<Char>。これは、実際には a を使用していないように聞こえるためですString(実際の文字列には、通常、null やその他の印刷できない文字は含まれません)。

于 2011-12-24T09:17:43.153 に答える
1

StringBufferクラスの同じ振る舞い?

「\0」は問題がありますので、使わないことをお勧めします。実際に文字列をDBに書き込むときは、より適切な区切り文字を「\0」に置き換えようとします。

于 2011-12-24T09:31:12.137 に答える
0

これは\、Java のエスケープ文字 (多くの C 関連言語と同様) であり、次のように追加を使用してエスケープする必要があるため\です。

String str="\\0Java language";
System.out.println(str);

コンソールに\0Java 言語を表示できるはずです。

于 2011-12-24T09:32:30.430 に答える