Можно ли добавить данные в строку после добавления "" (нуль)?

у меня есть строка, которую я создаю, и мне нужно добавить несколько символов "" (null) в строку. Между каждым нулевым символом находятся другие текстовые данные (только ASCII буквенно-цифровые символы).

моя проблема в том, что в J2SE при добавлении первого null () java, похоже, определяет, что это Терминатор строки (похожий на C++), и игнорирует все другие добавляемые данные. Ошибка не возникает, конечные данные просто игнорируются. Мне нужно заставить дополнительные трейлинг-данные после пустой строки. Я должен сделать это для устаревшей базы данных, которую я поддерживаю.

Я попытался кодировать / декодировать строку в надежде, что что-то вроде %00 обманет интерпретацию поведения строки, но когда я повторно кодирую строку, Java снова видит нулевой символ и удаляет все данные после первого null.

Update: вот соответствующий фрагмент кода. Да, я пытаюсь использовать Strings. Я собираюсь попробовать chars, но я все еще должен сохранить его в база данных как строка, поэтому я подозреваю, что у меня будет такая же проблема.

какой-то фон. Я получаю данные через HTTP post, который имеет "n". Мне нужно удалить строки и заменить их на "". В "debug" метод-это просто метод, который делает System.out.println.

                String[] arrLines = sValue.split("n");
                for(int k=0;k<arrLines.length;k++) {
                    if (0<k) {
                        sNewValue += "";
                    }
                    sNewValue+= arrLines[k];
                    debug("New value =" + sNewValue);
                }

sNewValue, строка, фиксируется в базе данных и должна выполняться как строка. Что я наблюдаю, когда я отображаю текущее значение sNewValue после каждой итерации в консоль примерно такая:

вход value1nValue2nValue3 Вывод в консоли дает мне из этого кода

value1
value1
value1

Я жду

value1
value1 value2
value1 value2 value3 

С непечатаемым null между value1, value2 и value3 соответственно. Обратите внимание, что значение, которое фактически сохраняется в базе данных, также является просто "value1". Таким образом, это не просто проблема с консольным дисплеем. Данные после игнорируются.

4 ответов


Я сильно подозреваю, что это не имеет ничего общего с текстом в самой строке - я подозреваю, что это просто то, как он отображается. Например, попробуйте следующее:

public class Test {
    public static void main(String[] args) {
        String first = "first";
        String second = "second";
        String third = "third";
        String text = first + "" + second + "" + third;
        System.out.println(text.length()); // Prints 18
    }
}

это печатает 18, показывая, что все символы присутствуют. Однако, если вы попытаетесь отобразить text в метке пользовательского интерфейса я бы не удивился, увидев только first. (То же самое может быть верно в довольно слабых отладчиках.)

аналогично вы должны иметь возможность использовать:

 char c = text.charAt(7);

и теперь c должно быть 'e' что вторая буква "второй".

в принципе, я ожидаю, что ядро Java не будет заботиться о том, что оно содержит U + 0000. Это просто еще один персонаж, насколько это касается Java. Только на границах с собственным кодом (например, display) это может вызвать проблему.

если это не поможет, пожалуйста, объясните ровно то, что вы наблюдали-то, что заставляет вас думать, что остальные данные не являются будучи добавленным.

EDIT: другой диагностический подход-распечатать значение Unicode каждого символа в строке:

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

Я предлагаю вам использовать char[] или List<Char> вместо этого, поскольку похоже, что вы на самом деле не используете String как таковой (реальная строка обычно не содержит нулей или других непечатаемых символов).


такое же поведение StringBuffer класса?

Так как "\0 " создает некоторые проблемы, я бы рекомендовал не использовать его. Я бы попытался заменить некоторым лучше разделитель С "\0 " при фактической записи строки в вашу БД.


Это так \ является escape-символом в Java (как и во многих языках, связанных с C), и вам нужно избежать его с помощью дополнительного \ следующим образом.

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

и вы должны иметь возможность отображения 0Java\язык на консоли.