添加“\ 0”(null)后是否可以将数据添加到字符串?

时间:2011-12-24 09:12:54

标签: java string terminator

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

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

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

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

一些背景知识。我通过HTTP帖子接收数据“\ n”。我需要删除换行符并用“\ 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之间使用不可打印的null。请注意,实际保存回数据库的值也只是“value1”。因此,它不仅仅是一个控制台显示问题。 \ 0之后的数据被忽略。

4 个答案:

答案 0 :(得分:14)

强烈怀疑这与字符串本身的文本无关 - 我怀疑它是如何显示的。例如,试试这个:

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,显示所有字符都存在。但是,如果您尝试在UI标签中显示text,我只会看到first并不会感到惊讶。 (在相当弱的调试器中也是如此。)

同样,您应该可以使用:

 char c = text.charAt(7);

现在c应为'e',这是“第二个”的第二个字母。

基本上,我希望Java的核心根本不关心它包含U + 0000的事实。就Java而言,它只是另一个角色。只有在本机代码(例如显示器)的边界处,它才可能导致问题。

如果这没有用,请解释完全您所观察到的内容 - 这使您认为其余数据未被追加。

编辑:另一种诊断方法是打印出字符串中每个字符的Unicode值:

for (int i = 0; i < text.length(); i++) {
    System.out.println((int) text.charAt(i));
}

答案 1 :(得分:2)

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

答案 2 :(得分:1)

StringBuffer类的行为相同吗?

由于“\ 0”会造成一些麻烦,我建议不要使用它。 在将字符串实际写入数据库时​​,我会尝试用“\ 0”替换更好的分隔符

答案 3 :(得分:1)

这是因为\是Java中的转义字符(与许多C相关语言中一样),您需要使用其他\来转义它,如下所示。

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

你应该可以在控制台上显示 \ 0Java语言