9

我有一个正在创建的字符串,我需要在字符串中添加多个“\0”(空)字符。在每个空字符之间,是其他文本数据(只是 ASCII 字母数字字符)。

我的问题是,在 J2SE 中,当您添加第一个 null (\0) 时,java 似乎确定它是一个字符串终止符(类似于 C++),并忽略所有其他附加数据。不会引发错误,只是忽略尾随数据。我需要在字符串中的 null 之后强制附加尾随数据。我必须为我支持的旧数据库执行此操作。

我试图对字符串进行编码/解码,希望像 %00 这样的东西会欺骗对字符串行为的解释,但是当我重新编码字符串时,Java 再次看到空字符,并删除第一个空字符后的所有数据。

更新:这是相关的代码片段。是的,我正在尝试使用Strings. 我打算尝试chars,但我仍然必须将它作为字符串保存到数据库中,所以我怀疑我最终会遇到同样的问题。

一些背景。我正在通过带有“\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,一个String,被提交到数据库,需要作为一个String来完成。当我sNewValue在控制台中显示每次迭代后的当前值时,我观察到的是这样的:

输入是 value1\nValue2\nValue3 控制台中的输出是从这段代码给我的

value1
value1
value1

我期待

value1
value1 value2
value1 value2 value3 

分别在 value1、value2 和 value3 之间具有不可打印的空值。请注意,实际保存回数据库的值也只是“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,表明所有字符都存在。但是,如果您尝试text在 UI 标签中显示,我不会惊讶地看到只有first. (在相当弱的调试器中可能也是如此。)

同样,您应该能够使用:

 char c = text.charAt(7);

而现在c应该是'e'“second”的第二个字母。

基本上,我希望 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

我建议您使用 a char[]orList<Char>代替,因为听起来您并没有真正使用 a String(真正的字符串通常不包含空值或其他不可打印的字符)。

于 2011-12-24T09:17:43.153 回答
1

StringBuffer班级的行为相同吗?

由于“\0”会造成一些麻烦,我建议不要使用它。在将字符串实际写入数据库时​​,我会尝试用“\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 回答