我在使用 PHP 的 base64_decode 函数:
- 在我们的 PHPUnit 测试中,我们可以解码 XML 并将其回显到控制台,并按照您的预期打印 XML(所有单元测试也都通过)。
-
当我们尝试在浏览器中运行相同的代码时,解码后的 XML 似乎包含大量 UTF-16 字符,其中散布着预期的 XML 标记片段。例如:
正如您可能期望的那样,当将此字符串传递给SimpleXMLElement 构造函数。
一些进一步的信息:
有人以前遇到过类似的事情或者知道可能导致这种情况的原因吗?
I'm having some strange issues with decoding an XML snippet, contained with a cookie, with PHP's base64_decode function:
- In our PHPUnit tests, we can decode the XML and echo it out to the console and it prints XML as you would expect (all unit tests pass as well).
-
As soon as we try running the same code in the browser, the decoded XML appears to contain loads of UTF-16 characters interspersed with fragments of the expected XML tags. For example:
<CreateSession\u000f\u0013Y...
As you might then expect, we end up with an Exception: String could not be parsed as XML... error when passing this string to the SimpleXMLElement constructor.
Some further info:
- The XML itself comes from an external login system and we don't have any control over it's format; it doesn't come with any <?xml...?> declaration and the root node is this <CreateSession>...</CreateSession> tag.
- I've checked the character encoding of the page being served and have verified that it is UTF-8.
- The site being developed is using Drupal
- We tried passing the XML / UTF-16 string through Drupal's drupal_convert_to_utf8 function, but this just returns the Chinese (I think) symbols e.g. 敲
Has anyone come across anything like this before or have any idea what might be causing this?
发布评论
评论(1)
啊哈!事实证明,当在浏览器中运行时,cookie 值会自动 URL 解码 由 PHP 处理,这意味着 base64 编码文本中的任何“+”都将被空格替换。在调用
base64_decode
之前添加这行代码修复了问题:Aha! It turns out that, when run in the browser, the cookie values were automatically URL decoded by PHP, meaning that any '+' in the base64 encoded text were being replaced by spaces. Adding this line of code before calling
base64_decode
fixed things: