rawurldecode

(PHP 4, PHP 5, PHP 7, PHP 8)

rawurldecode解码 URL 编码的字符串

说明

rawurldecode(string $string): string

返回一个字符串,其中百分号 (%) 后面跟着两个十六进制数字的序列被替换为文字字符。

参数

string

要解码的 URL。

返回值

返回解码后的 URL,以字符串形式。

示例

示例 #1 rawurldecode() 示例

<?php

echo rawurldecode('foo%20bar%40baz'); // foo bar@baz

?>

备注

注意:

rawurldecode() 不会将加号 ('+') 解码为空格。 urldecode() 会。

参见

添加笔记

用户贡献的笔记 8 笔记

21
php dot net at hiddemann dot org
19 年前
概括一下:这个函数与 urldecode 函数唯一的区别是 "+" 字符不会被转换。
8
Javier A. Segura at gmail dot com
16 年前
大家好 =) 我叫 Javier,来自阿根廷。
我在处理像 "ñ"、"Ñ"、"á"、"é"、"í" 等等这样的拉丁字符时遇到了一个小问题。
它们没有被 rawurlencode() 解码,所以我做了这个
<?php
function urlRawDecode($raw_url_encoded)
{
# 十六进制转换表
$hex_table = array(
0 => 0x00,
1 => 0x01,
2 => 0x02,
3 => 0x03,
4 => 0x04,
5 => 0x05,
6 => 0x06,
7 => 0x07,
8 => 0x08,
9 => 0x09,
"A"=> 0x0a,
"B"=> 0x0b,
"C"=> 0x0c,
"D"=> 0x0d,
"E"=> 0x0e,
"F"=> 0x0f
);

# 修复拉丁字符问题
if(preg_match_all("/\%C3\%([A-Z0-9]{2})/i", $raw_url_encoded,$res))
{
$res = array_unique($res = $res[1]);
$arr_unicoded = array();
foreach(
$res as $key => $value){
$arr_unicoded[] = chr(
(
0xc0 | ($hex_table[substr($value,0,1)]<<4))
| (
0x03 & $hex_table[substr($value,1,1)])
);
$res[$key] = "%C3%" . $value;
}

$raw_url_encoded = str_replace(
$res,
$arr_unicoded,
$raw_url_encoded
);
}

# 返回解码后的原始 URL 编码数据
return rawurldecode($raw_url_encoded);
}

print
urlRawDecode("%C3%A1%C3%B1");

// 输出:
// áñ

?>
例如,您有字符 "ñ",它以 "%C3%B1" 的形式编码。
这不过就是 0xc3 和 0xb1,
它们是二进制数(HHHH LLLL,其中 HHHH=高位,LLLL=低位)。
0xc3 = 1100 0011(二进制 8 位字),0xb1 = 1011 0001(二进制 8 位字),
要将原始编码字符转换为 ASCII,我们必须进行布尔运算
这两个操作数(0xc3 和 0xb1)之间,布尔代数由 George 定义
Boole,我们需要在这里使用它们。我们将要使用的第一个是
逻辑 OR(“|” 或“管道”)和逻辑 AND(“&” 或“人”)。

逻辑 OR 意味着以下真值表
a b (a OR b)
0 0 0
0 1 1 (a OR b 或两者,a 和 b,必须为真才能获得真结果)
1 0 1
1 1 1

逻辑 AND 意味着以下真值表
a b (a AND b)
0 0 0
0 1 0
1 0 0
1 1 1 (a 和 b 都必须为真才能获得真结果)

所以,这里我们必须对 0xc3 和 0xb1 的高位四位字节进行逻辑 OR 运算,
四位字节是半个字节(4 位),因此我们必须对
1100 (0xc) 和 1011 (0xb) 进行逻辑 OR 运算,我们将得到:1111 (0xf),然后我们必须对
两个低位四位字节进行逻辑 AND 运算,0011 (0x3) 和 0001 (0x1),我们将得到
这样:0001,所以,如果我们想看到最终结果,我们必须将高位和低位
四位字节放在其字节位置,如下所示:1111 0001 (0xf1),这不过就是
"ñ"(要检查这一点,请尝试以下操作:print(chr(0xf1));)。

这个 "<<" 是一个逻辑左移,如果我们有这个二进制数 0001 (1) 并进行这个
0001 << 2 我们将得到 0100 (4),右边的位将用 0 填充。

<?php
# 转换示例 %C3%B1 到 ASCII (0x71)
print(
chr(
(
0xc0|0x0b<<4) | (0x03&0x01)
)
);

// 输出将是:
// ñ

// 1100 0000 OR 1011 0000 = 1111 0000 (0xf0)
// 0000 0011 AND 0000 0001 = 0000 0001 (0x01)
// 1111 0000 OR 0000 0001 = 1111 0001 (0xf1)

?>

PS:非常抱歉我的英语,我知道,很糟糕 :P
4
jakub dot lopuszanski at nasza-klasa dot pl
10 年前
请注意,如果输出不是有效的 UTF-8,rawurldecode 不会以任何方式向您发出警告。
例如,如果传递给函数的输入只是 "%C5",由于 C 在二进制中是 1100,而以 110 开头的 UTF-8 字符后面应该跟另一个字符,所以 rawurldecode 的结果将只是一个单字节(值为 \xC5),它不是正确的 UTF-8。
将其与 Javascript 对比,Javascript 会向您发出警告

JAVASCRIPT

decodeURI("%C5")
URIError: URI 格式错误

decodeURIComponent("%C5")
URIError: URI 格式错误

unescape("%C5")
"Å"

PHP
var_dump(rawurldecode("%C5"))
string(1) "▒"

php -v
PHP 5.3.6 (cli) (built: Oct 4 2012 10:19:07)
版权所有 (c) 1997-2011 PHP 小组
Zend 引擎 v2.3.0,版权所有 (c) 1998-2011 Zend Technologies
包含 Suhosin v0.9.32.1,版权所有 (c) 2007-2010,由 SektionEins GmbH
-7
Tomek Perlak [tomekperlak at tlen pl]
17 年前
假设您在客户端和服务器之间以某种类似数组的结构传递一些数据。

如果在字段名称中使用 [] 方括号还不够(或者由于某种原因不符合项目的其余部分),您可能需要使用包含多个分隔符(行、字段、字段内部的行等)的字符串。

为了确保数据不会被误认为是分隔符,您可以使用 encodeURIComponent() JavaScript 函数。它与 rawurldecode() 配合得很好。

一旦传递到服务器端的字符串最终被分解成一个数组(或一组这样的数组),您可以使用以下函数递归地对数组进行 rawurldecode

<?php

function rawurldecode_array(&$arr)
{
foreach (
array_keys($arr) as $key)
{
if (
is_array($arr[$key]))
{
rawurldecode_array($arr[$key]);
}
else
{
$arr[$key] = rawurldecode($arr[$key]);
}
}
}

$a[0] = rawurlencode("2+1:3?9");
$a["k"] = rawurlencode("@:-/");
$a[-3][0] = rawurlencode("+");
$a[-3][2] = rawurlencode("=_~");
$a[-3]["a"] = rawurlencode("this+is a%test");

echo
"<pre>"; print_r($a); echo "</pre>";

rawurldecode_array($a);

echo
"<pre>"; print_r($a); echo "</pre>";

?>

程序将输出

数组
(
[0] => 2%2B1%3A3%3F9
[k] => %40%3A-%2F
[-3] => 数组
(
[0] => %2B
[2] => %3D_%7E
[a] => this%2Bis%20a%25test
)

)

数组
(
[0] => 2+1:3?9
[k] => @:-/
[-3] => 数组
(
[0] => +
[2] => =_~
[a] => this+is a%test
)

)
-9
Javier A. Segura at gmail dot com
16 年前
大家好 =) 我叫 Javier,来自阿根廷。
我在处理像 "ñ"、"Ñ"、"á"、"é"、"í" 等等这样的拉丁字符时遇到了一个小问题。
它们没有被 rawurlencode() 解码,所以我做了这个
<?php
function urlRawDecode($raw_url_encoded)
{
# 十六进制转换表
$hex_table = array(
0 => 0x00,
1 => 0x01,
2 => 0x02,
3 => 0x03,
4 => 0x04,
5 => 0x05,
6 => 0x06,
7 => 0x07,
8 => 0x08,
9 => 0x09,
"A"=> 0x0a,
"B"=> 0x0b,
"C"=> 0x0c,
"D"=> 0x0d,
"E"=> 0x0e,
"F"=> 0x0f
);

# 修复拉丁字符问题
if(preg_match_all("/\%C3\%([A-Z0-9]{2})/i", $raw_url_encoded,$res))
{
$res = array_unique($res = $res[1]);
$arr_unicoded = array();
foreach(
$res as $key => $value){
$arr_unicoded[] = chr(
(
0xc0 | ($hex_table[substr($value,0,1)]<<4))
| (
0x03 & $hex_table[substr($value,1,1)])
);
$res[$key] = "%C3%" . $value;
}

$raw_url_encoded = str_replace(
$res,
$arr_unicoded,
$raw_url_encoded
);
}

# 返回解码后的原始 URL 编码数据
return rawurldecode($raw_url_encoded);
}

print
urlRawDecode("%C3%A1%C3%B1");

// 输出:
// áñ

?>
例如,您有字符 "ñ",它以 "%C3%B1" 的形式编码。
这不过就是 0xc3 和 0xb1,
它们是二进制数(HHHH LLLL,其中 HHHH=高位,LLLL=低位)。
0xc3 = 1100 0011(二进制 8 位字),0xb1 = 1011 0001(二进制 8 位字),
要将原始编码字符转换为 ASCII,我们必须进行布尔运算
这两个操作数(0xc3 和 0xb1)之间,布尔代数由 George 定义
Boole,我们需要在这里使用它们。我们将要使用的第一个是
逻辑 OR(“|” 或“管道”)和逻辑 AND(“&” 或“人”)。

逻辑 OR 意味着以下真值表
a b (a OR b)
0 0 0
0 1 1 (a OR b 或两者,a 和 b,必须为真才能获得真结果)
1 0 1
1 1 1

逻辑 AND 意味着以下真值表
a b (a AND b)
0 0 0
0 1 0
1 0 0
1 1 1 (a 和 b 都必须为真才能获得真结果)

所以,这里我们必须对 0xc3 和 0xb1 的高位四位字节进行逻辑 OR 运算,
四位字节是半个字节(4 位),因此我们必须对
1100 (0xc) 和 1011 (0xb) 进行逻辑 OR 运算,我们将得到:1111 (0xf),然后我们必须对
两个低位四位字节进行逻辑 AND 运算,0011 (0x3) 和 0001 (0x1),我们将得到
这样:0001,所以,如果我们想看到最终结果,我们必须将高位和低位
四位字节放在其字节位置,如下所示:1111 0001 (0xf1),这不过就是
"ñ"(要检查这一点,请尝试以下操作:print(chr(0xf1));)。

这个 "<<" 是一个逻辑左移,如果我们有这个二进制数 0001 (1) 并进行这个
0001 << 2 我们将得到 0100 (4),右边的位将用 0 填充。

<?php
# 转换示例 %C3%B1 到 ASCII (0x71)
print(
chr(
(
0xc0|0x0b<<4) | (0x03&0x01)
)
);

// 输出将是:
// ñ

// 1100 0000 OR 1011 0000 = 1111 0000 (0xf0)
// 0000 0011 AND 0000 0001 = 0000 0001 (0x01)
// 1111 0000 OR 0000 0001 = 1111 0001 (0xf1)

?>

PS:非常抱歉我的英语,我知道,很糟糕 :P
-13
Cagivaracer
15 年前
请注意,encodeURIComponent (Javascript) 和 rawurldecode (PHP) 的组合只有在 php.ini 中关闭了 magic quotes 时(magic_quotes_gpc = Off)才能正常工作。
-4
admin at yemennownews dot com
6 年前
假设您在客户端和服务器之间以某种类似数组的结构传递一些数据。

如果在字段名称中使用 [] 方括号还不够(或者由于某种原因不符合项目的其余部分),您可能需要使用包含多个分隔符(行、字段、字段内部的行等)的字符串。

为了确保数据不会被误认为是分隔符,您可以使用 encodeURIComponent() JavaScript 函数。它与 rawurldecode() 配合得很好。

一旦传递到服务器端的字符串最终被分解成一个数组(或一组这样的数组),您可以使用以下函数递归地对数组进行 rawurldecode

<?php

function rawurldecode_array(&$arr)
{
foreach (
array_keys($arr) as $key)
{
if (
is_array($arr[$key]))
{
rawurldecode_array($arr[$key]);
}
else
{
$arr[$key] = rawurldecode($arr[$key]);
}
}
}

$a[0] = rawurlencode("2+1:3?9");
$a["k"] = rawurlencode("@:-/");
$a[-3][0] = rawurlencode("+");
$a[-3][2] = rawurlencode("=_~");
$a[-3]["a"] = rawurlencode("this+is a%test");

echo
"<pre>"; print_r($a); echo "</pre>";

rawurldecode_array($a);

echo
"<pre>"; print_r($a); echo "</pre>";

?>

程序将输出

数组
(
[0] => 2%2B1%3A3%3F9
[k] => %40%3A-%2F
[-3] => 数组
(
[0] => %2B
[2] => %3D_%7E
[a] => this%2Bis%20a%25test
)

)

数组
(
[0] => 2+1:3?9
[k] => @:-/
[-3] => 数组
(
[0] => +
[2] => =_~
[a] => this+is a%test
)

)

http://yemennownews.com
-11
Jameswhoto
2 年前
PHP:添加手册说明
-
Hydraruzxpnew4af - Гидра 的官方网站:https://onion.xn--hdraruxzpnew4af-n35h.com. 在这里您可以找到数千家商店和私人卖家,他们提供各种您选择的商品。 该平台向新用户和卖家开放。 无论您使用它的目的如何,您都可以轻松注册并获得最大权限。 Гидра-шоп 商店是独联体最大的商店,因此,使用它为每个用户打开了大量的可能性。 如果您打算购买商品,那么值得详细研究该项目,因为它提供来自不同卖家的众多商品。 它们在价格和特征上会有所不同。 因此,我们建议您仔细寻找选项并比较商店的评论,以便以有吸引力的价格获得最好的商品。 hydraruzxpnew4af


<a href=https://hydraruzapsnew4af.top>гидра купить
</a>

faga76iJ-1
To Top