почему нельзя закачать один и тот же URL в другом формате? - PullRequest
2 голосов
/ 06 января 2010

curl загрузок http://mysite.com/Lunacy%20Disc%202%20of%202%20(U)(Saturn).zip

но не

http://mysite.com/Lunacy Disc 2 of 2 (U)(Saturn).zip

Почему это так?

Нужно ли конвертировать его в первый формат?

использование URL-адреса, созданного с помощью urlencode ($ url), не удалось.

Ответы [ 6 ]

2 голосов
/ 06 января 2010

Две проблемы:

  1. urlencode также закодирует косые черты на вас. Он предназначен для кодирования строк запроса для использования в URL, а не в полных URL.
  2. urlencode кодирует пробелы как +. Вам нужно rawurlencode, если вы хотите пробелы как %20.
1 голос
/ 06 января 2010

urlencode() действительно не с curl, если ваша проблема только с пробелами, вы можете заменить их вручную

$url = str_replace(' ', '%20', $url);
1 голос
/ 06 января 2010

Чтобы преобразовать URL в «первый формат», вы можете использовать функцию PHP urlencode.


Теперь ответ на вопрос «почему» можно найти в RFC 1738 - Унифицированные указатели ресурсов (URL) .

Цитируя некоторые абзацы:

Octets must be encoded if they have no corresponding graphic
character within the US-ASCII coded character set, if the use of the
corresponding character is unsafe, or if the corresponding character
is reserved for some other interpretation within the particular URL
scheme.

No corresponding graphic US-ASCII:

URLs are written only with the graphic printable characters of the
US-ASCII coded character set. The octets 80-FF hexadecimal are not
used in US-ASCII, and the octets 00-1F and 7F hexadecimal represent
control characters; these must be encoded.

Пробел имеет код% 20 - он не находится в диапазоне 00-1F, поэтому его следует кодировать по этой причине ... Но чуть позже:

Unsafe:

   Characters can be unsafe for a number of reasons.  The space
   character is unsafe because significant spaces may disappear and
   insignificant spaces may be introduced when URLs are transcribed or
   typeset or subjected to the treatment of word-processing programs.

И здесь вы знаете, почему символ пробела тоже должен быть экранирован / закодирован; -)

0 голосов
/ 06 января 2010

Почему? Потому что некоторые символы имеют специальные значения, такие как # (html anchor).

Таким образом, все символы , кроме буквенно-цифровых , кодируются независимо от того, нужно ли их кодировать.

0 голосов
/ 06 января 2010

http://mysite.com/Lunacy Диск 2 из 2 (U) (Сатурн) .zip

Это недействительный URL. Доступ к таким URL-адресам может работать в вашем браузере, поскольку большинство современных браузеров автоматически кодируют URL-адрес для вас, если это необходимо. Библиотека curl не должна делать это автоматически.

0 голосов
/ 06 января 2010

Вам нужен urlencode для перевода пробелов (в вашем примере; есть другие символы, которым это требуется) для передачи через Интернет.Кодирование гарантирует, что различные протоколы связи не завершают или иным образом не изменяют строку, пока обрабатывают ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...