【问题标题】:Detect URL query string encoding检测 URL 查询字符串编码
【发布时间】:2011-06-16 18:14:46
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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"

【讨论】:

  • urldecode 会将 %E9 解码为值为 0xE9 的 byte,无论该字节可能代表什么字符。
  • 这也是错误的。一个字节就是一个字节。字符串也只是一个字节序列,它们只是数据而不是信息。仅当使用特定字符编码解释时,这些字节不仅是字节,而且还表示字符,因此是信息。而urldecode 只会将%93 转换为值为0x93 的字节。而已。仅当使用特定字符编码(如 ISO 8859-1)解释时,该字节表示该字符集中的字符(只要该字节序列有效)。
  • US-ASCII 字符集只有 128 个字符(使用 0x00–0x7F 编码)。任何其他字节都无效。
  • @Gumbo:等等,这是真的。我想我突然混合了我所有的字符集。那没关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2012-06-02
  • 1970-01-01
相关资源
最近更新 更多