2011-12-24 2 views
8

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

Моя проблема заключается в том, что в J2SE при добавлении первого значения null (\ 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, струнные, стремятся к базе данных и должен быть сделан в виде строки. Что я наблюдаю, когда я отобразить текущее значение sNewValue после каждой итерации в консоли что-то вроде этого:

вход value1 \ nValue2 \ nValue3 Вывод в консоль дает мне из этого кода

value1 
value1 
value1 

Я ожидаю

value1 
value1 value2 
value1 value2 value3 

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

+0

В Java, вы никогда не можете сказать: «нулевой символ». Его значение «null» и Java не используют символы ASCII, а используют unicode. – Lion

+0

Что ты собираешься делать с этой Строкой, когда она у тебя есть? – Tom

+1

@ Lion: Untrue - символ 0 в Unicode известен как нулевой символ. См. Http://www.unicode.org/charts/PDF/U0000.pdf –

ответ

12

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

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' который является второй буквой «второй».

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

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

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

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

Аналогично, если вы напишете его в базу данных с помощью PreparedStatement.setString(), я не уверен, что будет делать база данных. Возможно, это безопаснее с setBytes() или setBlob(). – greyfairer

+1

@greyfairer: Нет, если тип поля базы данных «varchar» или что-то подобное, IMO. –

+0

Ядром проблемы является поведение класса String и то, что он делает, когда видит «\ 0». – giulio

2

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

+0

-1: «настоящая строка» может содержать нулевые символы без проблем. Это всего лишь еще один персонаж, что касается Java. –

+0

@ Jon технически да, но это не отличная идея – artbristol

+2

Почему бы и нет? Если OP хочет представить такую ​​строку для действительного reaason, и нет технической причины, это не должно работать, почему бы избежать этого? Это больше похоже на проблему с дисплеем. –

1

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

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

1

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

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

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

+0

'' \ ''не является регулярным выражением. Это просто escape-символ в строковых литералах. –

+0

OP не хочет, чтобы обратная косая черта сопровождалась нулем в строке - он хочет иметь нулевой символ Unicode U + 0000. –

+0

О, я пропустил это. – Lion