Строковая замена Java и NUL (ПУСТОЙ УКАЗАТЕЛЬ, ASCII 0) символ?

Проверяя кого-то код elses, я заметил несколько страниц JSP, печатающих броские символы неASCII. При взятии падения в источник я нашел этот лакомый кусочек:

// remove any periods from first name e.g. Mr. John --> Mr John
firstName = firstName.trim().replace('.','\0');

Замена символа в Строке с нулевым символом даже работают в Java? Я знаю это '\0' завершит струну до. Это было бы преступником к броским символам?

31
задан praspa 17 March 2012 в 20:58
поделиться

5 ответов

Работает ли замена символа в строке на нулевой символ в Java? Я знаю, что '\ 0' завершит c-строку.

Это зависит от того, как вы определяете, что работает. Заменяет ли он все вхождения целевого символа на '\ 0' ? Абсолютно!

String s = "food".replace('o', '\0');
System.out.println(s.indexOf('\0')); // "1"
System.out.println(s.indexOf('d')); // "3"
System.out.println(s.length()); // "4"
System.out.println(s.hashCode() == 'f'*31*31*31 + 'd'); // "true"

Мне кажется, все работает нормально! indexOf может его найти, он считается частью длины, и его значение для вычисления хэш-кода равно 0; все как указано в JLS / API.

Он НЕ работает, если вы ожидаете, что замена символа нулевым символом каким-то образом удалит этот символ из строки. Конечно, так не работает. Нулевой символ остается символом!

String s = Character.toString('\0');
System.out.println(s.length()); // "1"
assert s.charAt(0) == 0;

Он также НЕ работает, если вы ожидаете, что нулевой символ завершит строку. Это очевидно из приведенных выше фрагментов, но это также четко указано в JLS ( 10.9.Массив символов не является строкой ):

В языке программирования Java, в отличие от C, массив char не является String , и ни Строка и массив char не оканчиваются '\ u0000' (символом NUL).


Может ли это быть виновником фанк-символов?

Теперь мы говорим о совершенно другом, то есть о том, как строка отображается на экране. По правде говоря, даже "Привет, мир!" будет выглядеть круто, если вы используете шрифт dingbats. Строка в Юникоде может выглядеть странно в одном регионе, но не в другом. Даже правильно отрисованная строка Unicode, содержащая, скажем, китайские иероглифы, может показаться странной для кого-то, скажем, из Гренландии.

Тем не менее, нулевой символ, вероятно, в любом случае будет выглядеть странно; обычно это не тот символ, который вы хотите отображать. Тем не менее, поскольку нулевой символ не является ограничителем строки, Java более чем способна обработать его так или иначе.


Теперь, чтобы решить, что, как мы предполагаем, является предполагаемым эффектом, то есть удалить весь период из строки, самым простым решением является использование перегрузки replace (CharSequence, CharSequence) .

System.out.println("A.E.I.O.U".replace(".", "")); // AEIOU

Здесь также упоминается решение replaceAll , но оно работает с регулярным выражением, поэтому вам нужно избегать метасимвола точки, и оно, вероятно, будет работать медленнее.

84
ответ дан 27 November 2019 в 21:31
поделиться

Это вызывает появление "фанковых символов":

System.out.println( "Mr. Foo".trim().replace('.','\0'));

производит:

Mr[] Foo

в моей консоли Eclipse, где [] отображается в виде квадратного поля. Как уже писали другие, используйте String.replace () .

2
ответ дан 27 November 2019 в 21:31
поделиться

Вероятно, следует изменить на

firstName = firstName.trim().replaceAll("\\.", "");
8
ответ дан 27 November 2019 в 21:31
поделиться

Работает ли замена символа в строке нулевым символом в Java?

Нет.

Неужели в этом виноваты фанковые персонажи?

Вполне вероятно.

4
ответ дан 27 November 2019 в 21:31
поделиться

Думаю, так и должно быть. Чтобы стереть символ, вы должны использовать вместо него replace (".", "") .

4
ответ дан 27 November 2019 в 21:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: