我作为$ _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
我在某处遗漏了某些东西......
答案 0 :(得分:2)
如果你不控制那个GET参数的来源,那么你无能为力。 PHP将按原样为您提供字符串,不会自动转换其编码。它不能,因为它不知道从转换的编码。没有任何规范或任何人可以从中获取该信息。 你需要指定你接受字符串的编码。不要让它由客户决定,因为那时你根本不知道你会得到什么。
如果客户端向您发送ISO-8859编码文本,但您希望它在内部进行UTF-8编码(合理选择BTW),则只需转换其编码即可。我会使用iconv('ISO-8859-1', 'UTF-8', $_GET['foo'])
,因为它更明确它的作用,但utf8_encode
恰好做同样的事情。