【问题标题】:PHP application/x-www-form-urlencoded decodes special character wronglyPHP application/x-www-form-urlencoded 错误解码特殊字符
【发布时间】:2014-04-30 17:31:20
【问题描述】:

远程 SMS 服务(我无法影响)将文本消息以 Content-Type: application/x-www-form-urlencoded 的形式发布到 PHP 控制器(如果重要,则属于 Symfony2 应用程序)

PHP 无法正确解码特殊字符。

tcpdump 显示(缩写 - 仅显示有问题的数据)

User-Agent: smsd (libwww-perl/5.805)
Content-Type: application/x-www-form-urlencoded
Content-Length: 123

data=ae+%E4+ue+%FC+oe+%F6+sz+%DF

原来的数据是

ae ä ue ü oe ö sz ß

并且 PHP $_POST 持有(序列化)

;s:4:"data";s:19:"ae ###e ###### sz ##;

我想,是缺少 charset=UTF-8 造成了麻烦。

如果有人知道如何克服这个问题,我会很感激你的回答。谢谢。

【问题讨论】:

  • 为什么要序列化?
  • 我认为他这样做是为了向我们展示原始内容。

标签: php post utf-8


【解决方案1】:

对于这个特定问题,我现在自己使用 iconv 找到了解决方案。

$decoded = iconv( 'ISO-8859-1', 'UTF-8', urldecode( $encoded ) );

我认为 PHP >= 5.4 中用于 urlencode/urldecode 的标准字符集现在是 UTF-8,尽管我在更改日志中没有找到专门针对这些函数的任何内容。

【讨论】:

  • 进一步详细说明我的答案:显然,导致问题的不是标头中缺少的 charset=UTF-8,而是自 5.4 以来 PHP 中隐式使用 UTF-8。也许标题中的显式 charset=ISO-8859-1 会有所帮助...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 2018-11-26
  • 1970-01-01
  • 2022-09-26
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
相关资源
最近更新 更多