检测URL查询字符串编码

Vel*_*cro 4 php ascii utf-8 character-encoding query-string

在请求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.

我怎样才能做到这一点?需要注意的是维基百科有一个类似的功能-它本身的编码%E9%C3%A9.

net*_*der 6

E9是十进制的233.它不是有效的ASCII字节(仅限0-127),但它é在ISO-8859-1(Latin1)中.使用时mb_convert_encoding,您可以指定多种编码(例如:UTF-8和ISO-8859-1).

这应该解决它:

mb_convert_encoding($str, 'UTF-8', 'UTF-8,ISO-8859-1');
Run Code Online (Sandbox Code Playgroud)

使用以下脚本:

$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'));
Run Code Online (Sandbox Code Playgroud)

我明白了:

string(19) "Documents partagés"
string(19) "Documents partagés"
Run Code Online (Sandbox Code Playgroud)