PHP - 字符串编码

时间:2016-02-26 10:50:27

标签: php encoding utf-8

我作为$ _GET参数收到一个字符串,其中"6d617263f2"为十六进制表示。

据我所知,字符编码不是UTF-8字符串。如果我用UTF-8编码打印它,我得到的是"marc�"。如果我使用utf8_encode将字符串转换为UTF-8,我会得到正确的表示形式,即marcò

我在php.ini文件中设置了所有字符编码(default_carset,iconv和mbstring)以使用UTF-8。我也将mbstring.encoding_translation设置为On

我无法完全理解发生了什么......为什么我的$_GET参数未能正确编码UTF-8

我的猜测是:

  • 客户端正在使用其他字符编码,如果我想使用UTF-8,则没有其他方法可以明确地将我的参数转换为UTF-8

  • 我在某处遗漏了某些东西......

你可以帮我解释一下吗?

1 个答案:

答案 0 :(得分:2)

如果你不控制那个GET参数的来源,那么你无能为力。 PHP将按原样为您提供字符串,不会自动转换其编码。它不能,因为它不知道从转换的编码。没有任何规范或任何人可以从中获取该信息。 需要指定你接受字符串的编码。不要让它由客户决定,因为那时你根本不知道你会得到什么。

如果客户端向您发送ISO-8859编码文本,但您希望它在内部进行UTF-8编码(合理选择BTW),则只需转换其编码即可。我会使用iconv('ISO-8859-1', 'UTF-8', $_GET['foo']),因为它更明确它的作用,但utf8_encode恰好做同样的事情。