PHP +字符编码+ GET参数

pqwbnv8z  于 2023-06-28  发布在  PHP
关注(0)|答案(3)|浏览(229)

我写了一个PHP脚本。
我通过以下URL运行我的PHP脚本:http://server/script.php?param1=%80t%80
所以我给PHP脚本传递了一个GET参数。
参数名为param 1。
param 1包含字符串“€t€”,URL编码为“%80t%80”。
我的PHP脚本使用UTF-8规范编码。
我想知道哪种字符编码适用于$_GET[“param 1”]中包含的字符串。
当然,$_GET[“param 1”]上的字符编码不是UTF-8。
原因:我的PHP脚本中的以下命令将导致“80 74 80”,这是$_GET[“param 1”]的十六进制表示。

var_dump(unpack("H*", $_GET["param1"]));

如果$_GET[“param 1”]上的字符编码是UTF-8,那么前面的PHP命令将导致“e2 82 ac 74 e2 82 ac”。
$_GET[“param 1”]上的字符编码也不是ISO-8859-1,因为€符号不包括在IS 0 -8859-1字符集中。
要查看ISO-8859-1编码表,请转到http://en.wikipedia.org/wiki/ISO/IEC_8859-1
因此mb_internal_encoding函数返回的PHP内部编码不适用于$_GET[“param 1”],因为它是IS 0 -8859-1。
有谁知道$_GET[“param 1”]中包含的字符串应用了哪种字符编码吗?

7vux5j2d

7vux5j2d1#

我不太明白为什么你在试图解决一个字符编码问题时要使用unpack。所以现在开始...
我假设你正在尝试读取$_GET ['param 1']的值,如下所示:
$var = $_GET ['param1'];我建议您尝试urldecode $var = urldecode($_GET ['param 1']),然后使用处理多字节字符串的函数http://gr.php.net/manual/en/ref.mbstring.php或使用iconv函数。
希望上面的帮助。

ffdz8vbo

ffdz8vbo2#

当然,$_GET[“param 1”]上的字符编码不是UTF-8。原因:我的PHP脚本中的以下命令将导致“80 74 80”,这是$_GET[“param 1”]的十六进制表示。
这正是你所期望的,因为这是你写的。参数%80t%80表示三个字符:十六进制80,“t”,十六进制80。%80表示“十六进制80”。您手动指定一个特定的十六进制值,字符编码根本不会涉及到这一点。
试试这个:

var_dump( unpack ("H*", urldecode("%80t%80")));

还有这个

http://server/script.php?param1=%e2%82%ac%74%e2%82%ac
myss37ts

myss37ts3#

根据https://www.w3schools.com/tags/ref_urlencode.ASP
“URL只能使用ASCII字符集通过Internet发送。”
实际上,ASCII的一个子集似乎是URL编码的目标。https://www.php.net/manual/en/function.urlencode.php说urlencode():
“在对要在URL的查询部分中使用的字符串进行编码时是方便的。将变量传递到下一页...[It]返回一个字符串,其中包含除-以外的所有非字母数字字符。已替换为百分号(%),后跟两个十六进制数字和编码为加号(+)的空格。它的编码方式与来自WWW表单的发布数据的编码方式相同,即与application/x-www-form-urlencoded媒体类型中的编码方式相同。这与RFC 3986编码(参见rawurlencode())的不同之处在于,由于历史原因,空格被编码为加号(+)。
这些显然是从ASCII中的其他字符或UTF-8或其他字符集中的其他字符表示Map到字母数字ASCII(至少加上.
-+%)。要Map回UTF-8,可能需要知道它的开头是什么。然而,在相反的方向,这是不清楚的:https://www.php.net/manual/en/function.urldecode.php说urldecode():
解码给定字符串中的任何%##编码。加号('+')被解码为空格字符。
不仅不清楚解码输出是UTF-8还是什么,而且(我发现自己在看这个问题的原因),当我想一个'+'被发送在一个参数通过URL(它作为$_GET[“paramName”]到达PHP),它作为一个空格到达(' '),直到我使用urlencode($paramVal)将'+'转换为%2B,然后将其插入URL。然后它显示在浏览器的网址小部件与?paramName=...%2B...但在PHP中,url解码为“+”。
我希望PHP urldecode()的输出是UTF-8,因为我在HTML头中有,但这是一个猜测。
我不觉得我的回答对你太有帮助,但如果我能读到我对你的问题的回答,这是在寻找解决我的问题时出现的,它会节省我一个小时。也许能帮助下一个人。

相关问题