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