Подтвердить что ты не робот

Замените строку Java и символ NUL (NULL, ASCII 0)?

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

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

Является ли замена символа в String нулевым символом даже на Java? Я знаю, что '\0' завершит C-строку. Будет ли это виновником напуганных персонажей?

4b9b3361

Ответ 1

Является ли замена символа в String нулевым символом даже на 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, и ни один из String, ни массив из char не заканчиваются символом "\ u0000" (символ NUL).


Будет ли это виновником фанковых персонажей?

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

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


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

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

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

Ответ 2

Вероятно, нужно изменить на

firstName = firstName.trim().replaceAll("\\.", "");

Ответ 3

Заменяет ли символ в строке с нулевым символом, даже работают в Java?

Нет.

Будет ли это виновником фанковых персонажей?

Довольно вероятно.

Ответ 4

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

Ответ 5

Это вызывает "funky characters":

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

дает:

Mr[] Foo

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