Php 检测URL查询字符串编码

Php 检测URL查询字符串编码,php,utf-8,character-encoding,query-string,ascii,Php,Utf 8,Character Encoding,Query String,Ascii,在请求URL上,我可以获取查询字符串?dir=Documents%20partag%C3%A9s或?dir=Documents%20partag%E9s。我认为第一个是UTF-8,第二个是ASCII 真正的字符串是:Documents partagés 因此,我有一个PHP脚本(UTF-8),我想做的是检测查询字符串是ASCII还是UTF-8,如果是ASCII,则将其转换为UTF-8 我尝试使用mb函数,但查询字符串始终被检测为ASCII,而查询字符串的urldecode版本被检测为UTF-8

在请求URL上,我可以获取查询字符串
?dir=Documents%20partag%C3%A9s
?dir=Documents%20partag%E9s
。我认为第一个是UTF-8,第二个是ASCII

真正的字符串是:
Documents partagés

因此,我有一个PHP脚本(UTF-8),我想做的是检测查询字符串是ASCII还是UTF-8,如果是ASCII,则将其转换为UTF-8

我尝试使用
mb
函数,但查询字符串始终被检测为ASCII,而查询字符串的urldecode版本被检测为UTF-8


我怎样才能做到这一点?请注意,Wikipedia有一个类似的功能—它将自己的
%E9
编码为
%C3%A9
E9
是233位小数。它不是有效的ASCII字节(仅0-127),但在ISO-8859-1(拉丁语1)中是
é
。使用
mb\u convert\u编码时
,可以指定多种编码(例如:UTF-8和ISO-8859-1)

这应该可以解决这个问题:

mb_convert_encoding($str, 'UTF-8', 'UTF-8,ISO-8859-1');
使用以下脚本:

$str1 = 'Documents%20partag%E9s';
$str2 = 'Documents%20partag%C3%A9s';
var_dump(mb_convert_encoding(urldecode($str1), 'UTF-8', 'UTF-8,ISO-8859-1'));
var_dump(mb_convert_encoding(urldecode($str2), 'UTF-8', 'UTF-8,ISO-8859-1'));
我得到:

string(19) "Documents partagés"
string(19) "Documents partagés"

也许php.net上的这个注释可以帮助您:
urldecode
%E9
解码到值为0xE9的字节,而不管这个字节代表什么字符。这也是错误的。一个字节就是一个字节就是一个字节。字符串也是字节序列,它们只是数据而不是信息。仅当使用特定字符编码进行解释时,这些字节不仅是字节,而且还表示字符,从而表示信息。而
urldecode
只将
%93
转换为值为0x93的字节。就这样。仅当使用特定字符编码(如ISO 8859-1)解释时,该字节表示该字符集中的字符(只要该字节序列有效)。US-ASCII字符集只有128个字符(用0x00–0x7F编码)。任何其他字节都无效。@Gumbo:等等,这是真的。我想我突然混合了我所有的魅力。那就别管了。