Изменение длины при декодировании и последующем перекодировании закодированной строки URL

Я использую приведенный ниже код, чтобы просто декодировать, а затем повторно кодировать (относительно длинную) закодированную строку URL, никогда не изменяя содержимое строки:

<?php

$string = 'Data=%7B%22Data%22%3A%22%5B%7B%5C%22RoomId%5C%22%3A%5C%225241306%5C%22%2C%5C%22ControlName%5C%22%3A%5C%221%3A0%3Arate%5C%22%2C%5C%22Rate%5C%22%3A%5C%22RACK%20RATE%5C%22%2C%5C%22Allocation%5C%22%3A%5C%222%5C%22%2C%5C%22Status%5C%22%3A%5C%22a%5C%22%2C%5C%22MinStay%5C%22%3A%5C%221%5C%22%2C%5C%22ErrorControlId%5C%22%3A%5C%221%3A0%3Arate%5C%22%2C%5C%22AllocationDate%5C%22%3A%5C%2216%2F09%2F2013%2000%3A00%3A00%5C%22%7D%2C%7B%5C%22RoomId%5C%22%3A%5C%225241306%5C%22%2C%5C%22ControlName%5C%22%3A%5C%220%3A0%3Arate%5C%22%2C%5C%22Rate%5C%22%3A%5C%22RACK%20RATE%5C%22%2C%5C%22Allocation%5C%22%3A%5C%221%5C%22%2C%5C%22Status%5C%22%3A%5C%22a%5C%22%2C%5C%22MinStay%5C%22%3A%5C%221%5C%22%2C%5C%22ErrorControlId%5C%22%3A%5C%220%3A0%3Arate%5C%22%2C%5C%22AllocationDate%5C%22%3A%5C%2215%2F09%2F2013%2000%3A00%3A00%5C%22%7D%5D%22%2C%22IsWizard%22%3Afalse%2C%22InitialBindDate%22%3A%2215%2F09%2F13%22%2C%22EndBindDate%22%3A%2217%2F09%2F2013%22%7D';
echo $string;

$decoded = urldecode($string);
echo "<br><br>$decoded";

$encoded = urlencode($decoded);
echo "<br><br>$encoded";

?>

Исходная строка имеет длину 930 символов. После декодирования и перекодирования он сократился до 924 символов. Почему это происходит и как я могу предотвратить это?

РЕДАКТИРОВАТЬ:

Следует отметить, что если я декодирую $encoded как таковой:

$decodedTwo = urldecode($encoded);
echo "<br><br>$decodedTwo";

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


person Juicy    schedule 11.09.2013    source источник


Ответы (1)


Перекодированная строка делает две вещи по-разному:

= перекодируется в %3D, что делает вашу строку на 2 символа длиннее.

%20 перекодируется как +, что делает строку на 8 символов короче (4 вхождения)

Чистая разница - это 6 символов, которые вы видите.

Выполнение простого str_replace, например

$encoded = str_replace(["%3D", "+"], ["=", "%20"], $encoded);

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

person Orangepill    schedule 11.09.2013
comment
Спасибо, я попробую завтра и посмотрю, сработает ли это. Мне нужно декодировать эту строку, изменить ее, закодировать и отправить обратно на сервер. Но сервер отказывается от моей перекодированной строки. Я думал, что сервер проверяет длину, но, как вы указали, это должно быть% 3D для = и + для% 20, что смущает его. - person Juicy; 11.09.2013
comment
Стоит отметить, что дальнейшее использование этого метода может выявить другие краеугольные случаи, когда реализация кодирования отличается. - person Orangepill; 11.09.2013