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

ang*_*guy 8 java string terminator

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

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

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

更新:这是相关的代码段.是的,我正在尝试使用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);
                }
Run Code Online (Sandbox Code Playgroud)

sNewValue是一个String,它被提交到数据库,需要以String的形式完成.当我sNewValue在控制台中每次迭代后显示当前值时,我观察到的是这样的:

input是value1 \nValue2 \nValue3控制台中的输出是通过此代码提供给我的

value1
value1
value1
Run Code Online (Sandbox Code Playgroud)

我期待着

value1
value1 value2
value1 value2 value3 
Run Code Online (Sandbox Code Playgroud)

在value1,value2和value3之间分别使用不可打印的null.请注意,实际保存回数据库的值也只是"value1".因此,它不仅仅是一个控制台显示问题.\ 0之后的数据被忽略.

Jon*_*eet 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
    }
}
Run Code Online (Sandbox Code Playgroud)

这打印18,显示所有字符都存在.但是,如果您尝试text在UI标签中显示,我不会感到惊讶first.(在相当弱的调试器中也是如此.)

同样,您应该可以使用:

 char c = text.charAt(7);
Run Code Online (Sandbox Code Playgroud)

现在c应该是'e'哪个是"第二个"的第二个字母.

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

如果这没有帮助,请准确说明您观察到的内容 - 它是什么让您认为其余数据未被追加.

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

for (int i = 0; i < text.length(); i++) {
    System.out.println((int) text.charAt(i));
}
Run Code Online (Sandbox Code Playgroud)

  • 同样,如果使用PreparedStatement.setString()将其写入数据库,我不确定数据库将执行什么操作.也许使用setBytes()或setBlob()更安全. (2认同)