Base64 解码法语字符
我们从第三方获取 Base64 编码 (XML) 数据。如果 XML 数据是英文的,则一切正常,我可以进行 Base64 解码并解析 XML。如果 XML 全部是小写法语字符,则一切正常。但是,如果 xml 数据包含大写法语字符(如 À),如果我进行 Base64 解码并尝试解析它,解析器将失败。关于如何解决这个问题有什么建议吗?
谢谢。
We are getting base64 encoded (XML) data from a third party. If the XML data is in English, everything works fine, I am able do base64 decode, and parse the XML. If the XML is all lower case French characters, everything works fine. But if the xml data contains upper case French characters (like À), if I do base64 decode and try to parse it, the parser fails. Any suggestions on how to fix this problem?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Base64 是一种使用 7 位/US-ASCII 字符对 8 位二进制数据进行编码的方法。 Base64 解码后,您应该有一个标准的 XML 文件。
该 XML 文件可能包含非法字符,或者未正确指定其使用的字符编码。
您提到了
À
,这是 À 的 HTML 特定(非 XML)表示形式。如果 XML 包含 HTML 编码字符串À
,则 XML 中还应该有对实体表的引用,指定如何解码该字符串。或者,如果您的 XML 直接包含 À 字符,并使用(例如)ISO-8859-1 字符集进行编码,则您的 XML 应指定此编码 (
),或者您应该在解码时自己指定。
否则,解析器可能会假设(例如)使用 UTF-8 编码,并且在尝试解码 À 时将失败。
确切的错误消息应该告诉您问题是什么。
[更新:直接À]:
听起来 XML 是无效的;他们说的是 UTF-8 但实际上使用的是不同的编码。检查 XML 字节(在 Base 64 解码之后);如果 À 被编码为一个字节,那么它肯定不是 UTF-8。
[更新:如何修复?] 如果他们在 XML 标头中错误地指定了它,他们应该真正替换错误的标头 (
)与正确的(
)。
如果他们没有指定任何内容,则看起来 iconv 函数可能是您的最好的选择。我并没有真正需要它,所以我对此不是 100% 确定,但看起来你可以在之后使用: $data = iconv("ISO-8859-1", "UTF-8", $data) base64_decode 和 simplexml_load_string 之前。我不知道在解码 XML 时直接指定编码的方法。
我对 PHP 的字符编码细节并没有真正的经验,所以我不提供任何保证......
Base64 is a method to encode 8-bit binary data using 7-bits/US-ASCII charachters. After the Base64 decode you should have a standard XML file.
Probably this XML file contains illegal characters, or does not correctly specify the character encoding it uses.
You mention
À
, an HTML-specific (not-XML) representation of À. If the XML contains the HTML encoded stringÀ
, there should also be a reference in the XML to an entity table specifying how to decode that string.Alternatively, if your XML contains the À character directly, encoded using (for example) the ISO-8859-1 character set, either your XML should specify this encoding (
<?xml version="1.0" encoding="ISO-8859-1"?>
), or you should specify it yourself when decoding it.Failing that, the parser may assume (e.g) UTF-8 encoding is used, and will fail when trying to decode the À.
The exact error message should tell you what the problem is.
[update: À directly]:
Sounds like the XML is invalid then; that they say UTF-8 but are actually using a different encoding. Check the XML bytes (after the base 64 decode) for this; if the À is encoded as one byte, it is definitely not UTF-8.
[update: how to fix?] If they incorrectly specify it in the XML header, they should really replace the false header (
<?xml version="1.0" encoding="UTF-8"?>
) with the correct one (<?xml version="1.0" encoding="windows-1252"?>
).If they don't specify anything, it looks like the iconv function may be your best bet. I haven't really needed it, so I'm not 100 % sure about this, but looks like you could use: $data = iconv("ISO-8859-1", "UTF-8", $data) after the base64_decode and before the simplexml_load_string. I don't know of a way to specify the encoding directly while decoding the XML.
I'm not really experienced with the PHP specifics of character encoding, so I'm not giving any guarantees...
XML 字符编码是什么?也许它不是
UTF-8
并且您的解析器正在尝试将XML
字符串解析为UTF-8
。What's the XML character encoding? Maybe it's not
UTF-8
and your parser is trying to parse theXML
string asUTF-8
.