【问题标题】:PHP - string encodingPHP - 字符串编码
【发布时间】:2016-02-26 10:50:26
【问题描述】:

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

据我了解字符编码,这不是 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

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

你能帮我解释一下吗?

【问题讨论】:

  • 您是在控制发送该 GET 参数,还是从无法控制的第 3 方接收它?
  • @deceze 无法控制的第三者

标签: php encoding utf-8


【解决方案1】:

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

如果客户端向您发送 ISO-8859 编码文本,但您希望它在内部采用 UTF-8 编码(顺便说一句,这是一个明智的选择),您只需转换其编码即可。我会使用iconv('ISO-8859-1', 'UTF-8', $_GET['foo']),因为它的作用更明确,但utf8_encode 恰好做了同样的事情。

【讨论】:

    猜你喜欢
    • 2013-04-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2013-12-29
    相关资源
    最近更新 更多