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

标签 java string terminator

我正在创建一个字符串,我需要向该字符串添加多个“\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/

相关文章:

java - Maven 测试在终端上失败,但在 IntelliJ 中通过

java - 如何使用Spring Security仅保护一个URL并允许所有URL

java - 禁止空字符串参数和抛出 RuntimeException 以阻止方法继续进行的优缺点

vim - 终结者未加载 .bashrc 或 .vimrc

c - 字符串中间的空终止符

java - 无法使用 Spring JDBC 通过 SSL 连接到 SQL Server

java - 线程 "main"javax.ws.rs.NotAcceptableException : HTTP 406 Not Acceptable 中的异常

python - 如何在字符串中查找项目的索引?

c++ - 无法在动态链接库中找到过程入口点 _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev

java - 添加 "\0"(null)后是否可以向字符串添加数据?