Oc-windows.ru

IT Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Php encode url

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 23 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 ));
>
?>

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 ));
>
?>

(tilde), while urlencode does.

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().

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.

I think the description does not exactly match what the function does:

Returns a string in which all non-alphanumeric characters
except -_. have been replaced with a percent (%) sign followed
by two hex digits and spaces encoded as plus (+) signs.

urlencode(‘ö’) gives me ‘%C3%B6’. So more then just a percent sign followed by two hex digits.

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

Constructing hyperlinks safely HOW-TO:

= ‘machine/generated/part’ ;
$url_parameter1 = ‘this is a string’ ;
$url_parameter2 = ‘special/weird «$characters»‘ ;

$link_label = «Click here & you’ll be » ;

echo ‘ , htmlspecialchars ( $url ), ‘»>’ , htmlspecialchars ( $link_label ), » ;
?>

This example covers all the encodings you need to apply in order to create URLs safely without problems with any special characters. It is stunning how many people make mistakes with this.

Shortly:
— Use urlencode for all GET parameters (things that come after each «=»).
— Use rawurlencode for parts that come before «?».
— Use htmlspecialchars for HTML tag parameters and HTML text content.

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

If you want to pass a url with parameters as a value IN a url AND through a javascript function, such as.

Читать еще:  Php html decode

. pass the url value through the PHP urlencode() function twice, like this.

= «index.php? > ;
$url = urlencode ( urlencode ( $url ));

= urldecode ( $_GET [ ‘url’ ]);
?>

If you don’t do this, you’ll find that the result url value in the target script is missing all the var=values following the ? question mark.

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 );

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 23 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 ));
>
?>

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 ));
>
?>

(tilde), while urlencode does.

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().

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 );

Читать еще:  Php environment variable

return $string ;
>
?>

. should solve this problem.

I think the description does not exactly match what the function does:

Returns a string in which all non-alphanumeric characters
except -_. have been replaced with a percent (%) sign followed
by two hex digits and spaces encoded as plus (+) signs.

urlencode(‘ö’) gives me ‘%C3%B6’. So more then just a percent sign followed by two hex digits.

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

Constructing hyperlinks safely HOW-TO:

= ‘machine/generated/part’ ;
$url_parameter1 = ‘this is a string’ ;
$url_parameter2 = ‘special/weird «$characters»‘ ;

$link_label = «Click here & you’ll be » ;

echo ‘ , htmlspecialchars ( $url ), ‘»>’ , htmlspecialchars ( $link_label ), » ;
?>

This example covers all the encodings you need to apply in order to create URLs safely without problems with any special characters. It is stunning how many people make mistakes with this.

Shortly:
— Use urlencode for all GET parameters (things that come after each «=»).
— Use rawurlencode for parts that come before «?».
— Use htmlspecialchars for HTML tag parameters and HTML text content.

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

If you want to pass a url with parameters as a value IN a url AND through a javascript function, such as.

. pass the url value through the PHP urlencode() function twice, like this.

= «index.php? > ;
$url = urlencode ( urlencode ( $url ));

= urldecode ( $_GET [ ‘url’ ]);
?>

If you don’t do this, you’ll find that the result url value in the target script is missing all the var=values following the ? question mark.

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 );

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.

Читать еще:  Php length of array

загрузите источник (или используйте 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 не завершает строку с , 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 (это толкает, но все еще вероятно, на мой взгляд).

    Ссылка на основную публикацию
    Adblock
    detector