使用base64_decode解码XML在PHPUnit中工作正常但在浏览器中返回UTF-16编码数据

时间:2010-07-20 13:51:45

标签: php drupal encoding base64

我在使用PHP base64_decode函数解码包含cookie的XML片段时遇到了一些奇怪的问题:

  1. 在我们的PHPUnit测试中,我们可以解码XML并将其回显到控制台,并按照您的预期打印XML(所有单元测试也会通过)。
  2. 一旦我们尝试在浏览器中运行相同的代码,解码的XML似乎包含大量UTF-16字符,其中散布着预期XML标记的片段。例如:

    <了createSession \ u000f \ u0013Y ...

  3. 正如您可能期望的那样,我们最终得到一个异常:将此字符串传递给SimpleXMLElement constructor时,无法将字符串解析为XML ... 错误。

    进一步的信息:

    • XML本身来自外部登录系统,我们无法控制它的格式;它没有任何<?xml ...?>声明和根节点是这个< CreateSession> ...< / CreateSession>标签
    • 我检查了所投放网页的字符编码,并确认其为UTF-8。
    • 正在开发的网站正在使用Drupal
    • 我们尝试通过Drupal的drupal_convert_to_utf8函数传递XML / UTF-16字符串,但这只返回中文(我认为)符号,例如敲

    有没有人之前遇到过这样的事情,或者知道可能导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:1)

啊哈!事实证明,当在浏览器中运行时,PHP值自动URL decoded,这意味着base64编码文本中的任何“+”都被空格替换。在调用base64_decode固定内容之前添加这行代码:

$tmp = str_replace(' ', '+', $value);