【问题标题】:How can I know if url-encoded string is UTF-8 or Latin-1 with PHP?我如何知道 url 编码的字符串是 UTF-8 还是带有 PHP 的 Latin-1?
【发布时间】:2014-01-27 14:58:35
【问题描述】:

我通过 url 从各个站点获取数据。 url参数使用phpurlencode()函数进行url编码,但字符编码仍然可以是UTF-8或Latin-1。

例如 é 字符,从 UTF-8 进行 url 编码时变为 %C3%A9,但从 Latin-1 进行 url 编码时,变为 %E9。

当我通过 url 获取数据时,我使用urldecode(),然后我需要知道字符编码是什么,所以我最终在将它们插入 MySQL 数据库之前使用utf8_encode

奇怪的是,下面的代码不起作用:

$x1 = 'Cl%C3%A9ment';
$x2 = 'Cl%E9ment';

echo mb_detect_encoding(urldecode($x1)).' / '.mb_detect_encoding(urldecode($x2));

它返回UTF-8 / UTF-8

这是为什么,我做错了什么,我怎么知道这些字符串的字符编码?

谢谢

【问题讨论】:

  • 如果您使用的是$_GET,则不应使用urldecode(),因为这些值已经解码。
  • @jeroen - 很可能,这只是一个创建简单测试用例的技巧。
  • @ÁlvaroG.Vicario 这个例子很清楚,这就是为什么它只是一个评论:-)

标签: php character-encoding url-encoding


【解决方案1】:

mb_detect_encoding() 在默认的第二个参数下通常是无用的:

<?php

$x1 = 'Cl%C3%A9ment';
$x2 = 'Cl%E9ment';

$encoding_list = array('utf-8', 'iso-8859-1');

var_dump(
    mb_detect_encoding(urldecode($x1), $encoding_list),
    mb_detect_encoding(urldecode($x2), $encoding_list)
);

...打印:

string(5) "UTF-8"
string(10) "ISO-8859-1"

【讨论】:

  • 它工作正常,谢谢!这是否意味着我需要提前知道可以使用什么编码?难道没有一种简单的方法可以检测任何现有的字符编码吗?
  • 这是一个 URL:它应该一直是 UTF-8,除非在真正的旧版和配置错误的浏览器中,它可以是 ISO-8859-1。我认为没有其他可能性。不,在现有的数百种编码中,没有简单可靠的方法来检测文本的编码。
猜你喜欢
  • 1970-01-01
  • 2013-02-20
  • 2015-01-17
  • 1970-01-01
  • 2018-09-07
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多