我正在创建一个字符串,我需要向该字符串添加多个“\0”(空)字符。每个空字符之间是其他文本数据(仅 ASCII 字母数字字符)。
我的问题是,在 J2SE 中,当您添加第一个 null (\0) 时,java 似乎会确定它是一个字符串终止符(类似于 C++),并忽略附加的所有其他数据。不会引发错误,只是忽略尾随数据。我需要在字符串中的空值后面强制添加附加的尾随数据。我必须对我支持的旧数据库执行此操作。
我尝试对字符串进行编码/解码,希望像 %00 这样的内容能够欺骗字符串行为的解释,但是当我重新编码字符串时,Java 再次看到空字符,并删除第一个空字符之后的所有数据。
更新:这是相关的代码片段。是的,我正在尝试使用Strings
。我打算尝试字符,但我仍然必须将其作为字符串保存到数据库中,所以我怀疑我最终会遇到同样的问题。
一些背景。我正在通过带有“\n”的 HTTP post 接收数据。我需要删除换行符并将其替换为“\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 之后的数据将被忽略。
最佳答案
我强烈怀疑这与字符串本身中的文本无关 - 我怀疑这只是它的显示方式。例如,试试这个:
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'
,它是“second”的第二个字母。
基本上,我希望 Java 核心根本不关心它包含 U+0000 的事实。就 Java 而言,这只是另一个角色。只有在与 native 代码(例如显示)的边界处才可能导致问题。
如果这没有帮助,请准确解释您所观察到的情况 - 是什么让您认为其余数据没有被附加。
编辑:另一种诊断方法是打印出字符串中每个字符的 Unicode 值:
for (int i = 0; i < text.length(); i++) {
System.out.println((int) text.charAt(i));
}
关于java - 添加 "\0"(空)后是否可以将数据添加到字符串中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45716429/