Можно ли добавить данные в строку после добавления "\ 0" (null)? - PullRequest
8 голосов
/ 24 декабря 2011

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

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

Я пытался закодировать / декодировать строку в надежде, что что-то вроде% 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);
                }

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

input is value1 \ nValue2 \ nValue3 Выходные данные в консоли дают мне этот код

value1
value1
value1

Я ожидаю

value1
value1 value2
value1 value2 value3 

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

Ответы [ 4 ]

14 голосов
/ 24 декабря 2011

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

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, показывая, что присутствуют все символы.Однако, если вы попытаетесь отобразить text в метке пользовательского интерфейса, я не удивлюсь, увидев только first.(То же самое может быть верно для довольно слабых отладчиков.)

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

 char c = text.charAt(7);

И теперь c должно быть 'e', что является второй буквойof "second".

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

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

РЕДАКТИРОВАТЬ: Другой диагностический подход заключается в распечатке значения Unicode каждого символа в строке:

for (int i = 0; i < text.length(); i++) {
    System.out.println((int) text.charAt(i));
}
2 голосов
/ 24 декабря 2011

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

1 голос
/ 24 декабря 2011

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

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

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

1 голос
/ 24 декабря 2011

То же самое для класса StringBuffer?

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

...