Page 4 of 4

Кавычки (QuoteSpace)

Posted: Sun 15 Sep, 2019 21:28
by Smitis

Latest post of the previous page:

DrKnS wrote: Sun 15 Sep, 2019 19:57 Ну как там, придумали, что с !\ делать - AI или новую закорючку?
Коротко напомню о проблеме:
- Пути могут содержать пробелы, поэтому их надо заключать в кавычки.
- Если путь в кавычках с \ на конце - некоторые программы воспринимают такой слеш как спецсимвол.
- Обратный слеш после кавычек воспринимается не правильно другими программами.
- Не ставить слеш совсем не получиться, так как корень диска всегда будет заканчиваться на \, а если добавлять \ в ручную к пути без слеша на конце, не все программы такой двойной слеш воспримут правильно.

Бардак, в общем, ещё со времён ДОСа.

Тут только поможет:
- Делать как я выше предложил - шаблон для путей. Тогда в критической ситуации всегда можно проверить через IF что там. (IF "!{P}"=="\")
- Делать AI, как Вы предложили.

Шаблоны универсальнее. AI, наверное, проще реализовать. Но как должен вести себя AI с корнем диска, не представляю.

Кавычки (QuoteSpace)

Posted: Sun 15 Sep, 2019 22:45
by Yegor
Smitis wrote: Sun 15 Sep, 2019 21:28 Если путь в кавычках с \ на конце - некоторые программы воспринимают такой слеш как спецсимвол.
Можно пример?

Нашел здесь: https://devblogs.microsoft.com/oldnewth ... 0/?p=12833

Кавычки (QuoteSpace)

Posted: Sun 15 Sep, 2019 23:42
by DrKnS
But what if you wanted a backslash at the end of the string? Then you protect the backslash with a backslash, leaving the quotation mark unprotected.
Т.е. правильно делать lalala\\", что, в принципе, логично.

Кавычки (QuoteSpace)

Posted: Mon 16 Sep, 2019 00:23
by makhaon
buniak_a_h wrote: Sun 15 Sep, 2019 18:09 Вам раньше бы не помешал: там конечного слэша вне кавычек никогда не было.
Мне мешала не столько текущая папка, а ctrl+[ ctrl+]. постоянно приходится их использовать. и конечный слэш был очень не удобен.
Smitis wrote: Sun 15 Sep, 2019 21:28 Делать AI, как Вы предложили.
Я вообще не вижу проблемы для файловой оболочки исправлять автоматом пути/файлы. Мы пишем софт с путями связанный ну очень относительно и отдаленно. И то у меня для правок путей целая отдельная функция:
  1. function NormalizePath(const DirName: string): string;
  2.  
  3. var
  4.  
  5.  AddSlash: boolean;
  6.  
  7. begin
  8.  
  9.  Result := ReplaceChr(DirName, '', '"?*''');
  10.  
  11.  case Result.Length of
  12.  
  13.   0: ;
  14.  
  15.   1: if CharInSet(UpCase(Result[1]), ['A'..'Z']) then
  16.  
  17.     Result := Result + ':\'
  18.  
  19.    else
  20.  
  21.   else
  22.  
  23.    if not Result.EndsWith('\') then
  24.  
  25.     Result := Result + '\';
  26.  
  27.  end;
  28.  
  29.  Result := ReplaceChr(Result, '\', '/');
  30.  
  31.  AddSlash := Result.StartsWith('\\');
  32.  
  33.  Result := ReplaceText(Result, '\\', '\');
  34.  
  35.  if AddSlash then
  36.  
  37.   Result := '\' + Result;
  38.  
  39. end;

Кавычки (QuoteSpace)

Posted: Mon 16 Sep, 2019 01:58
by Yegor
DrKnS wrote: Sun 15 Sep, 2019 23:42 Т.е. правильно делать lalala\\", что, в принципе, логично.
Там статья больше про CommandLineToArgvW. И разные компиляторы/CRT/RTL/библиотеки действительно могут парсить по-разному, например delphi не поддерживает "escaping", и там:
"a\" -> a\
"a"\ -> a\
"a\\b" -> a\\b
a""b -> ab
"a""b" -> ab

Кавычки (QuoteSpace)

Posted: Mon 16 Sep, 2019 08:14
by Smitis
Даже у самой MS парсинг строки идёт по разному. Например, в WSH (VBS, JS) обратный слеш - обычный символ

Code: Select all

For Each arg In WScript.Arguments : n=n+1 : WScript.Echo "Argument " & CStr(n-1) & ": <" & arg & ">" : Next