Escape-последовательности в аргументах командной строки (Java) - PullRequest
1 голос
/ 18 мая 2019

Согласно Как использовать аргумент разрыва строки

Когда вы определяете строку как «Hello \ nHello» в Java, она не содержит «\» персонаж. Это escape-последовательность для перевода строки: "\ n" просто один персонаж

Когда вы используете эту строку в качестве аргумента Программа, однако (так что строка определяется снаружи), "\ n" интерпретируется как два символа: «\» и «n».

Почему аргументы командной строки, содержащие escape-последовательности, также не будут компилироваться? Я думал, что аргументы командной строки помещаются в массив String [] args?

И аргументы String [] будут содержать args [0] = "Hello \ nJava";

Ответы [ 2 ]

3 голосов
/ 18 мая 2019

Аргументы командной строки не являются исходным кодом Java, поэтому правила значения символов в исходном коде Java не применяются.

Интерпретация или нет аргументов командной строки - это область интерпретатора команд; Ява не лечится специально. Например, \ n не подставляется внутри строки в кавычках в большинстве (всех?) Оболочек Linux:

  $ echo 'a \n b'
  a \n b

Вне кавычек обратный слеш-n означает буквально n, что точно так же, как и n, поскольку n не имеет никакого отношения к оболочке.

 $ echo a\nb
 anb

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

0 голосов
/ 18 мая 2019

Экранированные последовательности не преобразуются командными оболочками в соответствующие им коды символов ( Как я могу отобразить новую строку в командном файле? ), так что вам интересно, почему программа java не 'Не делайте некоторый массаж параметров, полученных при его вызове.Ну, причина проста: массаж произвольный , возможно, какой-то пользователь не ожидает, что строка будет интерпретирована как человеческий текст;но строка, которая представляет другие вещи, где произвольное преобразование экранированных кодов является неудачным обобщением.Некоторые примеры:

  1. Строки - это пути к файлам Windows, такие как c:\my\folder\number\n, там можно найти два \n, которые, если бы java произвольно обобщался как человеческий текст, допускали бы большую ошибку.
  2. Литерал ids, пароли, ascii art,
  3. Структурированное представление сериализуемого контента, такого как xml, объект модели, закрытый контент и т. Д.

Теперь, если вы определите этострока INSIDE Java-код, который будет скомпилирован, после компиляции все \? будут скомпилированы в соответствующий им escape-код (как особенность языка);но вы можете указать компилятору java не делать этого, экранируя escape, т.е. \\?;но этот сборник касается.Во время выполнения все строки являются не более чем char[], и к ним не применяется произвольный массаж.

Проверьте JLS:

Это компиляцияошибка времени, если символ, следующий за обратной косой чертой в escape, не является ASCII b, t, n, f, r, ", ', \, 0, 1, 2, 3, 4, 5, 6 или 7. Unicodeescape \ u обрабатывается ранее (§3.3).

...