【问题标题】:PHP parse_str outputs invalid charactersPHP parse_str 输出无效字符
【发布时间】:2019-11-11 22:16:06
【问题描述】:

我注意到parse_str 的以下行为。

我有一串 url 参数,例如:

"cat=sphd&bpmin=100&bpmax=500&xf=1229_Nackenb%FCgel%7E1231_Bluetooth%7E1999_Sony"

如果我使用parse_str,最后一个包含无效字符的参数如下所示:

        [params] => Array
            (
                [cat] => sphd
                [bpmin] => 100
                [bpmax] => 500
                [xf] => 1229_Nackenb�gel~1231_Bluetooth~1999_Sony

这基本上失败了json_encode:我需要它来缓存(在框架下)。

问题:如何json_encode 这样的数组与这样的字符或如何纠正这样的parse_str 输出实际做json_encode

谢谢。

【问题讨论】:

  • 这不是 parse_str 的“错误”,您只是将 URL 中的数据以某种 ISO-8859-x 编码而不是应有的 UTF-8 编码。

标签: php json string parsing


【解决方案1】:

URL 编码值%FC 表示字节 FC,在 ISO-8859-1 中解释为“ü”。 json_encode 需要 UTF-8 编码的字符,显然你也是,这就是为什么这个字符不能正确显示,json_encode 拒绝它。

如果您可以更改该 URL 的形成位置,请对 UTF-8 编码字符进行 URL 编码,以便获得 %C3%BC。如果你不能在那里修复它,你需要将解析的字符串从 ISO-8859-1 转换为 UTF-8,使用 iconvmb_convert_encoding 或者,我敢说,utf8_encode(这几乎不合适但只在这里一次)。

【讨论】:

  • 感谢您的回答。我怀疑这一点,但经过一番玩耍后,我没有解决。不幸的是,我无法更改 url,它是通过 API 接收的(并存储在本地应用程序数据库中),我需要保留解析的 url 参数以稍后重建 url。所以基本上在这种情况下,我需要从 ISO 编码并返回到 ISO。 ...对于这种情况,我更容易做一个解决方法:将一般选择功能修改为不从 db 中选择 url,在这种特殊情况下,我需要缓存 url 以外的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 2012-05-17
相关资源
最近更新 更多