Что такое код urlencode


Содержание

urlencode

(PHP 4, PHP 5, PHP 7)

urlencode — URL-кодирование строки

Описание

Эта функция удобна, когда закодированная строка будет использоваться в запросе, как часть URL, в качестве удобного способа передачи переменных на следующую страницу.

Список параметров

Строка, которая должна быть закодирована.

Возвращаемые значения

Возвращает строку, в которой все не цифро-буквенные символы, кроме -_. должны быть заменены знаком процента (%), за которым следует два шестнадцатеричных числа, а пробелы закодированы как знак сложения (+). Строка кодируется тем же способом, что и POST-данные веб-формы, то есть по типу контента application/x-www-form-urlencoded. Это отличается от кодирования по » RFC 3986 (см. rawurlencode() ) в том, что по историческим причинам, пробелы кодируются как знак «плюс» (+).

Примеры

Пример #1 Пример использования urlencode()

Пример #2 Пример использования urlencode() и htmlentities()

Примечания

Будьте внимательны с переменными, которые могут совпадать с элементами HTML. Такие сущности как &amp, &copy и &pound разбираются браузером и используется как реальная сущность, а не желаемое имя переменной. Это очевидный конфликт, на который W3C указывает в течение многих лет. См. подробности: » http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2

PHP поддерживает изменение разделителя аргументов на рекомендуемый W3C символ «точку с запятой» путём изменения директивы arg_separator в .ini файле. К сожалению, большинство пользовательских приложений не отправляют данные формы в формате с разделителем «точка с запятой». Более переносимый способ решить эту проблему — это использовать & вместо & в качестве разделителя. Вам не нужно будет для этого изменять PHP-директиву arg_separator. Оставьте разделитель как &, но кодируйте ваши URL с помощью htmlentities() или htmlspecialchars() .

Смотрите также

  • urldecode() — Декодирование URL-кодированной строки
  • htmlentities() — Преобразует все возможные символы в соответствующие HTML-сущности
  • rawurlencode() — URL-кодирование строки согласно RFC 3986
  • rawurldecode() — Декодирование URL-кодированной строки
  • » RFC 3986

User Contributed Notes 22 notes

urlencode function and rawurlencode are mostly based on RFC 1738.

However, since 2005 the current RFC in use for URIs standard is RFC 3986.

Here is a function to encode URLs according to RFC 3986.

function myUrlEncode ( $string ) <
$entities = array( ‘%21’ , ‘%2A’ , ‘%27’ , ‘%28’ , ‘%29’ , ‘%3B’ , ‘%3A’ , ‘%40’ , ‘%26’ , ‘%3D’ , ‘%2B’ , ‘%24’ , ‘%2C’ , ‘%2F’ , ‘%3F’ , ‘%25’ , ‘%23’ , ‘%5B’ , ‘%5D’ );
$replacements = array( ‘!’ , ‘*’ , «‘» , «(» , «)» , «;» , «:» , «@» , «&» , «=» , «+» , «$» , «,» , «/» , «?» , «%» , «#» , «[» , «]» );
return str_replace ( $entities , $replacements , urlencode ( $string ));
>
?>

(tilde), while urlencode does.

I needed encoding and decoding for UTF8 urls, I came up with these very simple fuctions. Hope this helps!

function url_encode ( $string ) <
return urlencode ( utf8_encode ( $string ));
>

function url_decode ( $string ) <
return utf8_decode ( urldecode ( $string ));
>
?>

I needed a function in PHP to do the same job as the complete escape function in Javascript. It took me some time not to find it. But findaly I decided to write my own code. So just to save time:

function fullescape ( $in )
<
$out = » ;
for ( $i = 0 ; $i strlen ( $in ); $i ++)
<
$hex = dechex ( ord ( $in [ $i ]));
if ( $hex == » )
$out = $out . urlencode ( $in [ $i ]);
else
$out = $out . ‘%’ .(( strlen ( $hex )== 1 ) ? ( ‘0’ . strtoupper ( $hex )):( strtoupper ( $hex )));
>
$out = str_replace ( ‘+’ , ‘%20’ , $out );
$out = str_replace ( ‘_’ , ‘%5F’ , $out );
$out = str_replace ( ‘.’ , ‘%2E’ , $out );
$out = str_replace ( ‘-‘ , ‘%2D’ , $out );
return $out ;
>
?>

It can be fully decoded using the unscape function in Javascript.

Like «Benjamin dot Bruno at web dot de» earlier has writen, you can have problems with encode strings with special characters to flash. Benjamin write that:

function flash_encode ( $input )
<
return rawurlencode ( utf8_encode ( $input ));
>
?>

. could do the problem. Unfortunately flash still have problems with read some quotations, but with this one:

function flash_encode ( $string )
<
$string = rawurlencode ( utf8_encode ( $string ));

$string = str_replace ( «%C2%96» , «-» , $string );
$string = str_replace ( «%C2%91» , «%27» , $string );
$string = str_replace ( «%C2%92» , «%27» , $string );
$string = str_replace ( «%C2%82» , «%27» , $string );
$string = str_replace ( «%C2%93» , «%22» , $string );
$string = str_replace ( «%C2%94» , «%22» , $string );
$string = str_replace ( «%C2%84» , «%22» , $string );
$string = str_replace ( «%C2%8B» , «%C2%AB» , $string );
$string = str_replace ( «%C2%9B» , «%C2%BB» , $string );

return $string ;
>
?>

. should solve this problem.

Don’t use urlencode() or urldecode() if the text includes an email address, as it destroys the «+» character, a perfectly valid email address character.

Unless you’re certain that you won’t be encoding email addresses AND you need the readability provided by the non-standard «+» usage, instead always use use rawurlencode() or rawurldecode().

Be careful when encoding strings that came from simplexml in PHP 5. If you try to urlencode a simplexml object, the script tanks.

I got around the problem by using a cast.

$newValue = urlencode( (string) $oldValue );

My solution is to replace «%» with «‘».
function urlencode ( $u )
<
return str_replace (array( «‘» , ‘%’ ),array( ‘%27’ , «‘» ), urlencode ( $u ));
>

function urldecode ( $u )
<
return urldecode ( strtr ( $u , «‘» , ‘%’ ));
>
?>

Below is our jsonform source code in mongo db which consists a lot of double quotes. we are able to pass this source code to the ajax form submit function by using php urlencode :

//get the json source code from the mongodb
$jsonform = urlencode ( $this -> data [ ‘Post’ ][ ‘jsonform’ ]);

?>
//AJAX SUBMIT FORM

if you have a url like this: test-blablabla-4>3-y-3 ( $_GET );

$foo = ‘test-bla-bla-4>2-y-3 ;
$foo_encoded = urlencode ( urlencode ( $foo ));
?>
; ?> «> ; ?>

look on index.php
array (size=0)
empty
test-bla-bla-4%253E2-y-3%253C6

look on test-bla-bla-4%253E2-y-3%253C6
array (size=1)
‘token’ => string ‘bla-bla-4>2-y-3

Simple static class for array URL encoding

/**
*
* URL Encoding class
* Use : urlencode_array::go() as function
*
*/
class urlencode_array
<

/** Main encoding worker
* @param string $perfix
* @param array $array
* @param string $ret byref Push record to return array
* @param mixed $fe Is first call to function?
*/
private static function encode_part ( $perfix , $array , & $ret , $fe = false )
<
foreach ( $array as $k => $v )
<
switch ( gettype ( $v ))
<
case ‘float’ :
case ‘integer’ :
case ‘string’ : $ret [ $fe ? $k : $perfix . ‘[‘ . $k . ‘]’ ] = $v ; break;
case ‘boolean’ : $ret [ $fe ? $k : $perfix . ‘[‘ . $k . ‘]’ ] = ( $v ? ‘1’ : ‘0’ ); break;
case ‘null’ : $ret [ $fe ? $k : $perfix . ‘[‘ . $k . ‘]’ ] = ‘NULL’ ; break;
case ‘object’ : $v = (array) $v ;
case ‘array’ : self :: encode_part ( $fe ? $perfix . $k : $perfix . ‘[‘ . $k . ‘]’ , $v , $ret , false ); break;
>
>
>

/** UrlEncode Array
* @param mixed $array Array or stdClass to encode
* @returns string Strings ready for send as ‘application/x-www-form-urlencoded’
*/
public static function go ( $array )
<
$buff = array();
if ( gettype ( $array ) == ‘object’ ) $array = (array) $array ;
self :: encode_part ( » , $array , $buff , true );
$retn = » ;
foreach ( $buff as $k => $v )
$retn .= urlencode ( $k ) . ‘=’ . urlencode ( $v ) . ‘&’ ;
return $retn ;
>
>

$buffer = array(
‘master’ => ‘master.zenith.lv’ ,
‘join’ =>array( ‘slave’ => ‘slave1.zenith.lv’ , ‘slave2’ =>array( ‘node1.slave2.zenith.lv’ , ‘slave2.zenith.lv’ )),
‘config’ => new stdClass ()
);
$buffer [ ‘config’ ]-> MaxServerLoad = 200 ;
$buffer [ ‘config’ ]-> MaxSlaveLoad = 100 ;
$buffer [ ‘config’ ]-> DropUserNoWait = true ;

$buffer = urlencode_array :: go ( $buffer );
parse_str ( $buffer , $data_decoded );

header ( ‘Content-Type: text/plain; charset=utf-8’ );
echo ‘Encoded String :’ . str_repeat ( ‘-‘ , 80 ) . «\n» ;
echo $buffer ;
echo str_repeat ( «\n» , 3 ) . ‘Decoded String byPhp :’ . str_repeat ( ‘-‘ , 80 ) . «\n» ;
print_r ( $data_decoded );

HTML Кодировка URL Ссылки

Кодировка URL преобразует символы в формат, который может передаваться через Интернет.

URL-унифицированный локатор ресурсов

Веб-обозреватели запрашивают страницы с веб-серверов с помощью URL-адреса.

URL-адрес веб-страницы, например: https://www.html5css.ru.

Кодировка URL (процентная кодировка)

URL-адреса можно отправлять только через Интернет с помощью Набор символов ASCII.

Поскольку URL-адреса часто содержат символы вне набора ASCII, URL-адрес должен быть преобразован в допустимый формат ASCII.

Кодировка URL заменяет небезопасные символы ASCII на «%», за которыми следуют две шестнадцатеричные цифры.

URL-адреса не могут содержать пробелы. Кодировка URL обычно заменяет пробел со знаком плюса (+) или с %20.

Ссылка кодировки ASCII

Ваш браузер будет кодировать входные данные, в соответствии с набором символов, используемым на вашей странице.

Набор символов по умолчанию в HTML5 — UTF-8.

Символ Для Windows-1252 Для UTF-8
Пробел %20 %20
! %21 %21
« %22 %22
# %23 %23
$ %24 %24
% %25 %25
& %26 %26
%27 %27
( %28 %28
) %29 %29
* %2A %2A
+ %2B %2B
, %2C %2C
%2D %2D
. %2E %2E
/ %2F %2F
%30 %30
1 %31 %31
2 %32 %32
3 %33 %33
4 %34 %34
5 %35 %35
6 %36 %36
7 %37 %37
8 %38 %38
9 %39 %39
: %3A %3A
; %3B %3B
%3E %3E
? %3F %3F
@ %40 %40
A %41 %41
B %42 %42
C %43 %43
D %44 %44
E %45 %45
F %46 %46
G %47 %47
H %48 %48
I %49 %49
J %4A %4A
K %4B %4B
L %4C %4C
M %4D %4D
N %4E %4E
O %4F %4F
P %50 %50
Q %51 %51
R %52 %52
S %53 %53
T %54 %54
U %55 %55
V %56 %56
W %57 %57
X %58 %58
Y %59 %59
Z %5A %5A
[ %5B %5B
\ %5C %5C
] %5D %5D
^ %5E %5E
_ %5F %5F
` %60 %60
a %61 %61
b %62 %62
c %63 %63
d %64 %64
e %65 %65
f %66 %66
g %67 %67
h %68 %68
i %69 %69
j %6A %6A
k %6B %6B
l %6C %6C
m %6D %6D
n %6E %6E
o %6F %6F
p %70 %70
q %71 %71
r %72 %72
s %73 %73
t %74 %74
u %75 %75
v %76 %76
w %77 %77
x %78 %78
y %79 %79
z %7A %7A
< %7B %7B
| %7C %7C
> %7D %7D
%7E %7E
%7F %7F
` %80 %E2%82%AC
 %81 %81
%82 %E2%80%9A
ƒ %83 %C6%92
%84 %E2%80%9E
%85 %E2%80%A6
%86 %E2%80%A0
%87 %E2%80%A1
ˆ %88 %CB%86
%89 %E2%80%B0
Š %8A %C5%A0
%8B %E2%80%B9
Π%8C %C5%92
 %8D %C5%8D
Ž %8E %C5%BD
 %8F %8F
 %90 %C2%90
%91 %E2%80%98
%92 %E2%80%99
%93 %E2%80%9C
%94 %E2%80%9D
%95 %E2%80%A2
%96 %E2%80%93
%97 %E2%80%94
˜ %98 %CB%9C
%99 %E2%84
š %9A %C5%A1
%9B %E2%80
œ %9C %C5%93
 %9D %9D
ž %9E %C5%BE
Ÿ %9F %C5%B8
%A0 %C2%A0
¡ %A1 %C2%A1
¢ %A2 %C2%A2
£ %A3 %C2%A3
¤ %A4 %C2%A4
¥ %A5 %C2%A5
¦ %A6 %C2%A6
§ %A7 %C2%A7
¨ %A8 %C2%A8
© %A9 %C2%A9
ª %AA %C2%AA
« %AB %C2%AB
¬ %AC %C2%AC
­ %AD %C2%AD
® %AE %C2%AE
¯ %AF %C2%AF
° %B0 %C2%B0
± %B1 %C2%B1
² %B2 %C2%B2
³ %B3 %C2%B3
´ %B4 %C2%B4
µ %B5 %C2%B5
%B6 %C2%B6
· %B7 %C2%B7
¸ %B8 %C2%B8
¹ %B9 %C2%B9
º %BA %C2%BA
» %BB %C2%BB
¼ %BC %C2%BC
½ %BD %C2%BD
¾ %BE %C2%BE
¿ %BF %C2%BF
À %C0 %C3%80
Á %C1 %C3%81
 %C2 %C3%82
à %C3 %C3%83
Ä %C4 %C3%84
Å %C5 %C3%85
Æ %C6 %C3%86
Ç %C7 %C3%87
È %C8 %C3%88
É %C9 %C3%89
Ê %CA %C3%8A
Ë %CB %C3%8B
Ì %CC %C3%8C
Í %CD %C3%8D
Î %CE %C3%8E
Ï %CF %C3%8F
Ð %D0 %C3%90
Ñ %D1 %C3%91
Ò %D2 %C3%92
Ó %D3 %C3%93
Ô %D4 %C3%94
Õ %D5 %C3%95
Ö %D6 %C3%96
× %D7 %C3%97
Ø %D8 %C3%98
Ù %D9 %C3%99
Ú %DA %C3%9A
Û %DB %C3%9B
Ü %DC %C3%9C
Ý %DD %C3%9D
Þ %DE %C3%9E
ß %DF %C3%9F
à %E0 %C3%A0
á %E1 %C3%A1
â %E2 %C3%A2
ã %E3 %C3%A3
ä %E4 %C3%A4
å %E5 %C3%A5
æ %E6 %C3%A6
ç %E7 %C3%A7
è %E8 %C3%A8
é %E9 %C3%A9
ê %EA %C3%AA
ë %EB %C3%AB
ì %EC %C3%AC
í %ED %C3%AD
î %EE %C3%AE
ï %EF %C3%AF
ð %F0 %C3%B0
ñ %F1 %C3%B1
ò %F2 %C3%B2
ó %F3 %C3%B3
ô %F4 %C3%B4
õ %F5 %C3%B5
ö %F6 %C3%B6
÷ %F7 %C3%B7
ø %F8 %C3%B8
ù %F9 %C3%B9
ú %FA %C3%BA
û %FB %C3%BB
ü %FC %C3%BC
ý %FD %C3%BD
þ %FE %C3%BE
ÿ %FF %C3%BF

Ссылка кодировки URL

Символы управления ASCII %00-%1F изначально были разработаны для управления аппаратными устройствами.

Управляющие символы не имеют ничего общего внутри URL.

urlencode vs rawurlencode?

Если я хочу создать URL-адрес с помощью переменной у меня есть два варианта для кодирования строки. urlencode() и rawurlencode() .

в чем конкретно разница и что предпочтительнее?

11 ответов:

это будет зависеть от вашей цели. Если совместимость с другими системами важна, то кажется, что rawurlencode-это путь. Единственным исключением являются устаревшие системы, которые ожидают, что строка запроса будет следовать стилю кодирования формы пробелов, закодированных как + вместо %20 (в этом случае вам нужен urlencode).

rawurlencode следует за RFC 1738 до PHP 5.3.0 и RFC 3986 после этого (см. http://us2.php.net/manual/en/function.rawurlencode.php)

возвращает строку, в которой все не цифробуквенные символы, кроме -_.

были заменены на знак процента ( % ), за которым следуют две шестнадцатеричные цифры. Это кодировка, описанная в » RFC 3986 для защиты буквенных символов от интерпретации в качестве специальных разделителей URL-адресов и для защиты URL-адресов от искажения средствами передачи с преобразованием символов (например, некоторые системы электронной почты).

примечание по RFC 3986 против 1738. rawurlencode до php 5.3 кодировал символ тильды (

) согласно RFC 1738. Однако, начиная с PHP 5.3, rawurlencode следует за RFC 3986, который не требует кодирования символов Тильды.

urlencode кодирует пробелы как знаки плюс (не как %20 как сделано в rawurlencode) (см. http://us2.php.net/manual/en/function.urlencode.php)

возвращает строку, в которой все не цифробуквенные символы, кроме -_. были заменены знаком процента (%) за которым следует два шестнадцатеричных числа, а пробелы кодируются как знак сложения ( + ). Он кодируется таким же образом, как и опубликованные данные из формы WWW, то есть так же, как и в типе носителя application/x-www-form-urlencoded. Это отличается от кодировки «RFC 3986» (см. rawurlencode()) тем, что по историческим причинам пробелы кодируются как знаки плюс ( + ).

это соответствует определению для application/x-www-form-urlencoded in RFC 1866.

Дополнительная Информация:

и RFC 2396 стоит посмотреть. RFC 2396 определяет допустимый синтаксис URI. Основная часть, которая нас интересует, — это компонент запроса 3.4:

Как видите, + является зарезервированным символом в строке запроса и, следовательно, должен быть закодирован в соответствии с RFC 3986 (как в rawurlencode).

доказательство находится в исходном коде PHP.

я возьму вас через быстрый процесс, как узнать такого рода вещи в будущем в любое время вы хотите. Потерпите меня, там будет много исходного кода C, который вы можете просмотреть (я объясню это). если вы хотите освежить некоторые C, хорошим местом для начала является наш SO wiki.

загрузите источник (или используйте http://lxr.php.net/ чтобы просмотреть его в интернете), grep все файлы для имя функции, вы найдете что-то вроде этого:

PHP 5.3.6 (последний на момент написания статьи) описывает две функции в их собственном коде C в файле url.c.

RawUrlEncode()

UrlEncode ()

хорошо, так что же здесь изменилось?

они оба по существу вызывают две различные внутренние функции соответственно: php_raw_url_encode и php_url_encode

так что идите искать эти функции!

давайте посмотрим на php_raw_url_encode

и конечно, php_url_encode:

один быстрый бит знаний, прежде чем я двинусь вперед, EBCDIC-это еще один набор символов, похож на ASCII, но полный конкурент. PHP пытается справиться с обоими. Но в основном это означает, что байт EBCDIC 0x4c байт не является L в ASCII, это на самом деле . Я уверен, что вы видите здесь путаницу.

обе эти функции управляют EBCDIC, если веб-сервер определил его.

кроме того, они оба используют массив символов (думаю типа String) hexchars чтобы получить некоторые значения, массив описывается следующим образом:

кроме того, функции действительно разные, и я собираюсь объяснить их в ASCII и EBCDIC.

различия в ASCII:

URLENCODE:

  • вычисляет начальную / конечную длину входной строки, выделяет память
  • проходит через цикл while, увеличивается до тех пор, пока мы не достигнем конца строки
  • захватывает настоящий символ
  • если символ равен ASCII Char 0x20 (т. е. «пробел»), добавьте + войдите в выходную строку.
  • если это не пробел, и это также не буквенно-цифровой ( isalnum(c) ), а также не является и _ , — или . символ, то мы, выводим a % войдите в позицию массива 0, сделайте массив до hexchars массив для поиска os_toascii массив (массив из Apache, что означает char в шестнадцатеричный код) для ключа c (настоящий символ), затем мы побитово сдвигаем вправо на 4, присваиваем это значение символу 1, а для позиции 2 мы назначаем тот же поиск, за исключением того, что мы предварительно формируем логическое и видим, что значение равно 15 (0xF) и возвращает 1 в этом случае, или 0 в противном случае. В конце концов, вы получите что-то закодированное.
  • если он заканчивается, это не пробел, это буквенно-цифровой или один из _-. chars, он выводит именно то, что есть.

RAWURLENCODE:

  • выделяет память для строки
  • перебирает его на основе длины, указанной в вызове функции (не вычисляется в функции, как с URLENCODE).

Примечание: многие программисты, вероятно, никогда не видели, чтобы цикл for повторялся таким образом, это несколько хакерское и не стандартное соглашение, используемое с большинством for-loops, обратите внимание, оно назначает x и y проверяет выход на len достигая 0, и шагом x и y . Я знаю, это не то, что вы ожидали, но это действительный код.

  • присваивает текущий символ соответствующему символу позиция в str .
  • он проверяет, является ли данный символ буквенно-цифровым или одним из _-. символы, и если это не так, мы делаем почти то же самое назначение, что и с URLENCODE, где он преформирует поиск, однако мы увеличиваем по-разному, используя y++ , а не to[1] , это потому, что строки строятся по-разному, но в конце концов достигают одной и той же цели.
  • когда цикл закончен и длина ушла, он фактически завершает строку, назначение байт.
  • он возвращает закодированную строку.

отличия:

  • UrlEncode проверяет наличие пробела, присваивает знак+, RawURLEncode-нет.
  • UrlEncode не назначает байт в строку, RawUrlEncode делает (это может быть спорным моментом)
  • они повторяются по-разному, один может быть склонен к переполнению с деформированными строками, я просто предлагаю это и я не фактически расследовано.

они в основном повторяются по-разному, один назначает знак + в случае ASCII 20.

различия в EBCDIC:

URLENCODE:

  • та же настройка итерации, что и с ASCII
  • все еще переводя символ «пробел» в A + знак. Примечание— Я думаю, что это должно быть скомпилировано в EBCDIC или вы будете в конечном итоге с ошибкой? Может кто-то редактировать и подтверждать это?
  • он проверяет, является ли данный символ символом перед 0 , за исключением того, что . или — ,или меньше A но больше, чем char 9 ,или больше Z и меньше a а не _ . или больше z (да, EBCDIC немного испорчен для работы). Если он соответствует любому из них, выполните аналогичный поиск, как найдено в версии ASCII (это просто не требует поиска в os_toascii).

RAWURLENCODE:

  • та же настройка итерации, что и с ASCII
  • такая же проверка, как описано в EBCDIC версии URL Encode, за исключением того, что если она больше z , это исключает

из URL кодировать.

  • то же назначение, что и ASCII RawUrlEncode
  • еще добавить байт в строку, прежде чем возвращаться.
  • Большой Резюме

    • оба используют одну и ту же таблицу поиска hexchars
    • URIEncode не завершает строку с \0, raw делает.
    • если вы работаете в EBCDIC, я бы предложил использовать RawUrlEncode, поскольку он управляет

    что UrlEncode не делает (об этом сообщается). Стоит отметить, что ASCII и EBCDIC 0x20 являются пробелами.

  • они повторяются по-разному, один может быть быстрее, можно быть склонным к эксплойтам на основе памяти или строк.
  • URIEncode делает пробел в + , RawUrlEncode делает пробел в %20 через поиск в массиве.
  • отказ от ответственности: я не касался C годами, и я не смотрел на EBCDIC в действительно очень долгое время. Если я где-то ошибаюсь, дайте мне знать.

    предлагаемые реализации

    исходя из всего этого, rawurlencode путь большую часть времени. Как и ты увидеть в ответ Джонатан Fingland, и придерживаться его в большинстве случаев. Он имеет дело с современной схемой для компонентов URI, где в качестве urlencode делает все по-старому, где + означает «пространство».»

    если вы пытаетесь конвертировать между старым форматом и новыми форматами, убедитесь, что ваш код не ошибается и не превращает что-то, что является декодированным знаком+, в пространство случайно двойным кодированием или аналогичными сценариями «oops» вокруг этого пространства/20%/+.

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

    в принципе, вы должны придерживаться raw, если ваша система EBCDIC действительно не ненавидит вас. Большинство программистов никогда не столкнутся с EBCDIC в любой системе, созданной после года 2000, может быть, даже 1990 (это толкает, но все же вероятно, на мой взгляд).

    urlencode против rawurlencode?

    Если я хочу создать URL-адрес с помощью переменной, у меня есть два варианта кодирования строки. urlencode() и rawurlencode() .

    каковы именно различия и какие предпочтительнее?

    11 ответов

    это будет зависеть от вашей цели. Если совместимость с другими системами важна, то кажется, что rawurlencode-это путь. Единственным исключением являются устаревшие системы, которые ожидают, что строка запроса будет следовать стилю кодирования форм пробелов, закодированных как + вместо %20 (в этом случае вам нужен urlencode).

    rawurlencode следует за RFC 1738 до PHP 5.3.0 и RFC 3986 после этого (см. http://us2.php.net/manual/en/function.rawurlencode.php)

    возвращает строку, в которой все не цифробуквенные символы, кроме -_.

    были заменены знаком процента ( % ), за которым следуют две шестнадцатеричные цифры. Это кодировка, описанная в » RFC 3986 для защиты буквальных символов от интерпретации в качестве специальных разделителей URL-адресов и для защиты URL-адресов от искажения средствами передачи с преобразованием символов (например, некоторыми системами электронной почты).

    примечание по RFC 3986 против 1738. rawurlencode до php 5.3 закодировал символ тильды (

    ) согласно RFC 1738. Однако с PHP 5.3 rawurlencode следует RFC 3986, который не требует кодирования символов Тильды.

    urlencode кодирует пробелы как знаки плюса (не как %20 как сделано в rawurlencode) (см.http://us2.php.net/manual/en/function.urlencode.php)

    возвращает строку, в которой все не цифробуквенные символы, кроме -_. были заменены знаком процента (%) за которым следует два шестнадцатеричных числа, а пробелы кодируются как знак сложения ( + ). Он кодируется так же, как кодируются опубликованные данные из формы WWW, то есть так же, как в типе носителя application/x-www-form-urlencoded. Это отличается от кодировки «RFC 3986» (см. rawurlencode ()) тем, что по историческим причинам пробелы кодируются как знаки плюс ( + ).

    это соответствует определению для application/x-www-form-urlencoded in RFC 1866.

    Дополнительная Информация:

    и RFC 2396 стоит посмотреть. RFC 2396 определяет допустимый синтаксис URI. Основная часть, которая нас интересует, — это компонент запроса 3.4:

    Как видите, + является зарезервированным символом в строке запроса и, следовательно, должен быть закодирован согласно RFC 3986 (как в rawurlencode).

    доказательство находится в исходном коде PHP.

    я проведу вас через быстрый процесс, как узнать такие вещи самостоятельно в будущем в любое время, когда вы хотите. Потерпите со мной, будет много исходного кода C, который вы можете просмотреть (я объясняю это). если вы хотите освежить некоторые C, хорошим местом для начала является наша so wiki.

    загрузите источник (или используйте http://lxr.php.net/ чтобы просмотреть его онлайн), grep все файлы для имя функции, вы найдете что-то вроде этого:

    PHP 5.3.6 (самый последний на момент написания) описывает две функции в их собственном коде C в файле URL-адрес.c.

    RawUrlEncode()

    UrlEncode ()

    хорошо, так что здесь изменилось?

    они оба по существу вызывают две разные внутренние функции соответственно: php_raw_url_encode и php_url_encode

    так что идите искать эти функции!

    давайте посмотрим на php_raw_url_encode

    и конечно, php_url_encode:

    один быстрый бит знаний, прежде чем я двинусь вперед,EBCDIC-это еще один набор символов, похож на ASCII, но общий конкурент. PHP пытается справиться с обоими. Но в основном это означает, что байт EBCDIC 0x4c байт не является L в ASCII, это на самом деле . Я уверен, что вы видите здесь путаницу.

    обе эти функции управляют EBCDIC, если веб-сервер определил его.

    кроме того, они оба используют массив символов (думаю типа String) hexchars look-up чтобы получить некоторые значения, массив описывается следующим образом:

    помимо этого, функции действительно разные, и я собираюсь объяснить их в ASCII и EBCDIC.

    различия в ASCII:

    URLENCODE:

    • вычисляет начальную / конечную длину входной строки, выделяет память
    • проходит через цикл while, шагом, пока мы не достигнем конца строки
    • захватывает настоящий символ
    • если символ равен ASCII Char 0x20 (т. е. «пробел»), добавьте + войдите в выходную строку.
    • если это не пробел, и это также не буквенно-цифровой ( isalnum(c) ), а также нет и _ , — или . символ, то мы, выводим % войдите в положение массива 0, сделайте массив, посмотрите на hexchars массив для поиска os_toascii array (массив из Apache, что означает char для шестнадцатеричного кода) для ключа c (настоящий символ), затем мы побитовое смещение вправо на 4, присваиваем это значение символу 1, а позиции 2 мы назначаем тот же поиск, за исключением мы предварительно формируем логический и посмотреть, если значение 15 (0xF) и возвращает 1 в этом случае, или 0 в противном случае. В конце концов, вы получите что-то закодированное.
    • если это заканчивается, это не пробел, это буквенно-цифровой или один из _-. chars, он выводит именно то, что он есть.

    RAWURLENCODE:

    • выделяет память для строки
    • перебирает его на основе длины, указанной в вызове функции (не вычисляется в функции, как с Функция urlencode).

    Примечание: многие программисты, вероятно, никогда не видели цикл for итерации таким образом, это несколько хакерский и не стандартное соглашение, используемое с большинством for-loops, обратите внимание, он назначает x и y проверяет выход на len достигая 0, и шагом x и y . Я знаю, это не то, что вы ожидали, но это действительный код.

    • присваивает текущий символ соответствующему символу позицию str .
    • он проверяет, является ли данный символ буквенно-цифровым или одним из _-. chars, и если это не так, мы делаем почти то же назначение, что и с URLENCODE, где он преформирует поиск, однако мы увеличиваем по-разному, используя y++ , а не to[1] , это потому, что строки строятся по-разному, но все равно достигают одной и той же цели в конце.
    • когда цикл завершен и длина ушла, он фактически завершает строку, назначение байт.
    • он возвращает закодированную строку.

    отличия:

    • UrlEncode проверяет пространство, присваивает знак+, RawURLEncode-нет.
    • UrlEncode не назначает байт в строку, RawUrlEncode делает (это может быть спорный момент)
    • они повторяются по-разному, можно быть склонным к переполнению искаженными строками, я просто предлагаю это и я не фактически расследовано.

    они в основном повторяются по-разному, один назначает знак + в случае ASCII 20.

    различия в EBCDIC:

    URLENCODE:

    • та же настройка итерации, что и в ASCII
    • все еще переводя символ «пробел» на + знак. Примечание — Я думаю, что это должно быть скомпилировано в EBCDIC или вы в конечном итоге с ошибкой? Может кто-нибудь редактировать и подтверждать это?
    • он проверяет, является ли настоящий символ символом перед 0 , за исключением того, что . или — , или меньше A но больше, чем char 9 , или больше Z и меньше a а не _ . или больше z (да, EBCDIC немного запутался в работе). Если он соответствует любому из них, выполните аналогичный поиск, как найдено в версии ASCII (это просто не требует поиска в os_toascii).

    RAWURLENCODE:

    • та же настройка итерации, что и в ASCII
    • такая же проверка, как описано в EBCDIC версии URL-кодирования, за исключением того, что если он больше, чем z , это исключает

    из кодирования URL.

  • то же назначение, что и ASCII RawUrlEncode
  • еще добавить байт в строку, прежде чем возвращаться.
  • Большой Резюме

    • оба используют одну и ту же таблицу поиска hexchars
    • URIEncode не завершает строку с \0, raw делает.
    • если вы работаете в EBCDIC, я бы предложил использовать RawUrlEncode, так как он управляет

    этот UrlEncode не делает (это проблемы). Стоит отметить, что ASCII и EBCDIC 0x20 являются пробелами.

  • они повторяются по-разному, один может быть быстрее, можно быть склонным к эксплойтам на основе памяти или строк.
  • URIEncode делает пробел в + , RawUrlEncode делает пробел в %20 через поиск в массиве.
  • отказ от ответственности: я не прикасался к C годами, и я не смотрел на EBCDIC действительно очень долгое время. Если я где-то ошибаюсь, дай мне знать.

    предлагаемые реализации

    основываясь на всем этом, rawurlencode-это способ идти большую часть времени. Как и ты увидеть в ответ Джонатан Fingland, и придерживаться его в большинстве случаев. Он имеет дело с современной схемой для компонентов URI, где как urlencode делает вещи старой школы, где + означает «пространство».»

    если вы пытаетесь конвертировать между старым форматом и новыми форматами, убедитесь, что ваш код не ошибается и не превращает что-то, что является декодированным знаком+, в пространство случайно двойным кодированием или аналогичными сценариями «oops» вокруг этого пространства/20%/+.

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

    в основном, вы должны придерживаться raw, если ваша система EBCDIC действительно ненавидит вас. Большинство программистов никогда не столкнутся с EBCDIC на любой системе, сделанной после года 2000, может быть, даже 1990 (это толкает, но все еще вероятно, на мой взгляд).

    Как использовать urlencoded urls с кодом отслеживания GA

    У меня есть сайт, на котором на странице бронирования есть iframe, встроенный в фактическую форму бронирования. Мне нужно отслеживать трафик с родительского сайта на дочерний iframe. Это должно все нормально работать с обычным кодом GA, используя javascript, например:

    И затем, конечно, используя функцию _getLinkerUrl(), чтобы получить URL-адрес с соответствующими параметрами.

    До сих пор так хорошо — это в основном работает (по крайней мере, я знаю, что принцип работает, так как я работаю на других страницах). Однако это и проблема: сервер, обслуживающий страницу в iframe, был настроен полным и полным дебилом (или, альтернативно, созданным полным и полным дебилом). Он задыхается от символов «=», поэтому, чтобы запросить страницу iframe, мне нужно указать urlencode знаки «=», но код GA, похоже, не сможет разобрать URL-адрес, когда это будет сделано.

    Итак, вопросы: 1. Кто-нибудь сталкивался с этим? 2. Кто-нибудь знает какие-либо решения этой проблемы?

    Я пошел с обходным решением для этой проблемы: закодируйте URL-адрес по мере необходимости, затем включите script на странице, чтобы декодировать URL-адрес, прежде чем у Google появится возможность его проверить. Затем, на последнем шаге, установите куки файлы по мере необходимости, поэтому googles ga-код отправляет правильные значения. Чтобы было ясно: все вышеперечисленное должно выполняться до нормального кода ga.

    Что такое код urlencode

    БлогNot. PHP: urlencode и urldecode — что нужно для скриптов в однобайтовой кодировке

    PHP: urlencode и urldecode — что нужно для скриптов в однобайтовой кодировке

    Распространённая у новичков проблема — функции urlencode и urldecode работают «неожиданно», если кодировка — не UTF-8.

    Да, с одной стороны urldecode должна думать, что её аргумент в UTF-8:

    data should first be encoded as octets according to the UTF-8 character encoding
    отсюда

    Поэтому, делая всё в однобайтовой кодировке, например, Windows-1251, мы рискуем увидеть на выходе юникодовские «кракозябры»:

    Здесь строка получена параметром URL и скрипт под именем script.php вызван из корневой папки локалхоста запросом

    В данном случае браузер получает строку «как есть», в нём при этом выставлена кодировка Windows-1251 и в Denwer тоже.

    Если передать скрипту уже URL-кодированный однобайтовым кодом «привет» запросом

    то всё, конечно, напечатается нормально. А вот для «двухбайтового» URL-запроса

    скрипт опять покажет «кракозябры» на странице и правильный «привет» в адресной строке — кодировка-то у нас всюду однобайтовая :) В общем, если входная кодировка другая, чем Юникод, решением проблемы будет iconv.

    Так, показать URL-кодированную запись переданного через URL «привета» и сам исходный «привет» можно в виде

    (показано только содержимое тега ). Как видим, переменные адресной строки браузера предполагаются заданными в Юникоде, даже если на локалхосте и в коде страницы указана другая кодировка.

    Если сам файл со скриптом тоже в кодировке Windows-1251 и переменная $q задана непосредственно в скрипте (или прочитана из файла, базы данных в той же кодировке), её декодировать не нужно:

    Обратите внимание, что из-за однобайтовой кодировки в данном случае получатся не юникодовские «октеты», а нормальные байты. Преобразование будет обратимо и в однобайтовой кодировке:

    21.09.2015, 17:13; рейтинг: 8031

    FoxTools v.2.0

    Привет, Гость! Ваш IP: 188.64.174.135

    Кодер/Декодер Url

    Что такое Url?

    URL (Uniform Resource Locator) – это единый указатель ресурсов, общепринятый способ записи адреса в сети Интернет.

    Как правило, URL состоит из протокола, домена, номера порта (по умолчанию зависит от протокола), расположения каталога или страницы, параметров запроса, а также может содержать логин и пароль для доступа к серверу.

    Поскольку изначально сеть Интернет разрабатывалась для нужд американских военных, URL имеет один существенный недостаток. В URL можно использовать только символы ASCII: английские буквы, цифры и некоторые спец.символы. Остальные символы нужно кодировать. Кодируются символы в шестнадцатеричный вид с простановкой вначале каждого символа знака процента (%).

    Сайт построен на HTML5

    Для корректной работы данного сайта требуется HTML5.

    Пожалуйста, воспользуйтесь браузером, который поддерживает HTML5. Многие современные браузеры поддерживают HTML5. Например:

    Текущие плагины и программы для Mozilla Firefox ® и др.

    Главное меню

    Ссылки на ресурсы

    Кодер, декодер URL адреса или текст.
    Онлайн сервисы на нашем сайте. — Онлайн интернет-сервисы на сайте.

    Url Encode / Decode.

    Система кодирования URL (Uniform Resource Locator Encode/Decode) заключается в том, чтобы заменить «небезопасный» символ при передачи данных, так называемым «безопасным», где перед шестнадцатеричным эквивалентом ставится знак процента — ‘%’ (percent‐encoding).

    Символы, которые не кодируются, определены спецификацией RFC3986 (англ.), бывший стандарт RFC2396 (англ.)

    Справка в Википедии: Юникод, кодировка ASCII, идентификатор ресурса URI

    Для кодирования URL из национальных символов в символы ASCII, используют Punycode (см. ниже)

    Например, введя в данную форму кодированный текст, состоящий до кодирования, из не английских символов:

    Получим после декодирования, следующий нормально читаемый текст:

    URL Декодировщик / Кодировщик.

    URL Декодировщик / Кодировщик.

    Для работы декодера / кодера, В Вашем браузере должен быть разрешен JavaScript.

    Рекомендованные правила для кодирования

    Не резервированные

    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    a b c d e f g h i j k l m n o p q r s t u v w x y z
    0 1 2 3 4 5 6 7 8 9 — _ .

    Резервированные

    Дополнительные ресурсы декодирования и кодирования

    Декодер и разбор URL:

    • trueurl.net (на сайте можно также проверить URL на спам)
    • pressbin.com — URL-encode и URL-decode (используются функции PHP и JavaScript)
    • webtoolhub.com — Кодирование URL и декодирование URL. На сайте, имеются множество и других полезных сервисов (более 60): HTML Encoder Decoder, HTML To Text Converter, HTML Encrypter, URL Deobfuscator, URL Expander (раскодировщик коротких URL). англ.)

    opinionatedgeek.com — Декодировщик Base 64 Encoder в режиме онлайн. Объем до 10мб
    opinionatedgeek.com — Определение маскированного IP адреса (маскировку IP, часто используют спамеры). Кодирование или декодирование IP

    coderstoolbox.net — Строковый конвертер: Base64, XML, URL, ECMAScript, набор символов. В кодировке: US-ASCII, ISO-8859-1, UTF-8, а также другие бесплатные онлайн-инструменты: конвертер времени (Unix, ISO 8601, RFC 2822), сетевой конвертер, XPath.

    freeformatter.com — Бесплатные онлайн инструментов для разработчиков. Инструменты: форматирование и проверка кода (JSON, HTML, XML, SQL), кодеры и декодеры (URL, Base 64).

    Расширение Flagfox подключается к сервису разбора URL — urlparser.com. Переход к сервису, осуществляется путем нажатии правой кнопкой мышки в адресной строке по флагу и выбор в меню — Парсер URL

    Punycode.

    Для кодирования URL из национальных символов в символы ASCII, воспользуйтесь сервисом: «Punycode конвертер» на сайте — wwhois.ru

    , превратится после Punycode конвертера в:

    , что является правильной записью для URL.

    Примечание. Если Вы будете отправлять URL, содержащий символы национальной кодировки, в различные веб-сервисы: каталоги, веб-формы, веб-анализаторы и т.д, то используйте Punycode конвертер.

    URLEncode и URLDecode online

    Текст для кодирования urlencode

    Текст который нужно закодировать, или раскодированный текст:

    Введите или скопируйте текст в соответствующее поле. Кодировка или раскодировка будет выполнена автоматически.

    Закодированный текст:

    Закодированный текст в кодировке UTF-8:

    Закодированный текст в кодировке windows-1251:

    Текст закодированные функцией escape() браузера Microsoft Internet Explorer:

    Как правильно использовать UrlEncode и Decode

    Итак, у меня есть файл, который я загружаю в хранилище azure blob:

    C: \ test folder \ A + B \ testfile.txt

    и два метода расширения, которые помогают закодировать мой путь, чтобы удостовериться, что ему присвоено правильное имя памяти azure storage blob

    Поэтому при загрузке файла я кодирую его AsUriPath и получаю имя test% 20folder \ A + B \ testfile.txt но когда я пытаюсь вернуть это в качестве пути к файлу, я получаю тестовую папку \ A B \ testfile.txt , которая, очевидно, не совпадает (код + был удален)

    Каков правильный способ использования UrlEncode и UrlDecode для обеспечения того, что вы получите ту же информацию, что и в кодировке, которую вы первоначально кодировали?

    Илон Маск рекомендует:  Топ-17 приемов из психологии, которые полезно знать.
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL