我们从第三方获取base64编码(XML)数据。如果XML数据是英文的,一切正常,我可以进行base64解码,并解析XML。如果XML都是小写的法语字符,一切正常。但是如果xml数据包含大写的法语字符(如& Agrave),如果我执行base64解码并尝试解析它,则解析器将失败。关于如何解决这个问题的任何建议?
感谢。
答案 0 :(得分:3)
Base64是一种使用7位/ US-ASCII字符编码8位二进制数据的方法。在Base64解码后,您应该有一个标准的XML文件。 可能这个XML文件包含非法字符,或者没有正确指定它使用的字符编码。
你提到了À
,这是一种特定于HTML(非XML)的À表示。如果XML包含HTML编码的字符串À
,那么XML中也应该有一个实体表引用,指定如何解码该字符串。
或者,如果您的XML直接包含À字符,使用(例如)ISO-8859-1字符集进行编码,那么您的XML应该指定此编码(<?xml version="1.0" encoding="ISO-8859-1"?>
),或者您应该自己指定它解码时。
如果失败,解析器可能会假设(例如)使用UTF-8编码,并且在尝试解码À时会失败。
确切的错误消息应该告诉您问题所在。
[更新:À直接]: 听起来像XML是无效的;他们说UTF-8但实际上使用的是不同的编码。检查XML字节(在base 64解码之后);如果À被编码为一个字节,则绝对不是UTF-8。
[更新:如何修复?]如果他们在XML标头中错误地指定了它,他们应该用正确的标头(<?xml version="1.0" encoding="UTF-8"?>
)替换假标头(<?xml version="1.0" encoding="windows-1252"?>
)。
如果他们没有指定任何内容,看起来iconv函数可能是您最好的选择。我并不是真的需要它,所以我对此并不是100%肯定,但看起来你可以使用:$ data = iconv(“ISO-8859-1”,“UTF-8”,$ data)之后base64_decode和simplexml_load_string之前。我不知道在解码XML时直接指定编码的方法。
我对PHP的字符编码细节并不熟悉,所以我不给予任何保证......
答案 1 :(得分:1)
什么是XML字符编码?也许它不是UTF-8
而您的解析器正在尝试将XML
字符串解析为UTF-8
。