我有一个我正在创建的字符串,我需要在字符串中添加多个“\ 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之后的数据被忽略。
答案 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语言。