2016-02-26 100 views
1

我接收$ _GET参数作为十六进制表示形式的"6d617263f2"字符串。PHP - 字符串编码

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

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

我无法完全理解正在发生什么...为什么我没有使用UTF-8正确编码$_GET参数?

我的猜测是:

  • 客户端使用其它字符编码,如果我想使用UTF-8,也就是明确地我的参数转换为UTF-8

  • 没有其他办法

    我在某处丢失了某些东西...

请问你能帮我解释一下吗?

+0

您是否在控制发送该GET参数,还是从不可控的第三方接收它? – deceze

+0

@deceze无法控制的第三方 – marcosh

回答

2

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

如果客户端向您发送ISO-8859编码文本,但您希望它在内部进行UTF-8编码(一个明智的选择),您只需转换其编码。我会使用iconv('ISO-8859-1', 'UTF-8', $_GET['foo']),因为它更明确,但utf8_encode碰巧完全一样。