Как преобразовать любое пустое пространство в символ? - PullRequest
1 голос
/ 05 августа 2020

Я использую String.strip() (Java 11) для удаления конечных и ведущих пробелов из строки. В строке есть 25 различных видов пробелов . Я хочу протестировать свой код с некоторыми из этих 25 типов пробелов.

У меня есть пример кода, который преобразует определенный тип пробелов (например, \u2002) в char, а затем использует это в строке. Когда я пытаюсь преобразовать другой тип пробела, например \u000A, в char, я получаю ошибку компилятора. Почему так происходит и как это исправить?

public static void main(String...args){
    char chr = '\u2002';//No problem.

    //Compiler error : 
    //Intellij IDEA compiler - Illegal escape character in character literal.
    //Java compiler - java: illegal line end in character literal.
    chr = '\u000a';

    String text = chr + "hello world" + chr;
    text = text.strip();
    System.out.println(text);
}

1 Ответ

3 голосов
/ 05 августа 2020

Вы уверены, что вместо этого не видите эту ошибку?

ошибка: недопустимый конец строки в символьном литерале

Escape-последовательности, такие как \u000a, обрабатываются очень в начале процесса компиляции. \u000a заменяется фактическим символом перевода строки (кодовая точка 10).

Это как если бы вы написали это:

    chr = '
';

поэтому, когда я пытаюсь скомпилировать ваш код с использованием JDK 11.0.8, я получаю ошибку «недопустимый конец строки».

Это раннее преобразование описано в Java Спецификации языка :

Так как escape-символы Unicode обрабатываются очень рано, неправильно записывать '\u000a' для символьного литерала, значение которого - перевод строки (LF); escape-код Unicode \u000a преобразуется в фактический перевод строки на этапе перевода 1 (§3.3), а перевод строки становится LineTerminator на этапе 2 (§3.4), и поэтому символьный литерал недействителен на этапе 3. Вместо этого следует используйте escape-последовательность '\n' (§3.10.6). Точно так же неправильно писать '\u000d' для символьного литерала, значением которого является возврат каретки (CR). Вместо этого используйте '\r'.

...