检测URL查询字符串编码

时间:2011-01-27 18:32:18

标签: php utf-8 character-encoding query-string ascii

在请求网址上,我可以获取查询字符串?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

1 个答案:

答案 0 :(得分: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');

使用以下脚本:

$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"