【问题标题】:base64 decode French charactersbase64解码法语字符
【发布时间】:2011-01-26 17:55:52
【问题描述】:

我们正在从第三方获取 base64 编码 (XML) 数据。如果 XML 数据是英文的,那么一切正常,我可以进行 base64 解码并解析 XML。如果 XML 都是小写法语字符,则一切正常。但是如果 xml 数据包含大写的法语字符(如 &Agrave),如果我进行 base64 解码并尝试解析它,解析器就会失败。有关如何解决此问题的任何建议?

谢谢。

【问题讨论】:

  • 您需要提供更多信息,解析器的文件,您收到的错误消息等。
  • 问题显然出在解析器上……你用的是什么工具?
  • XML 字符编码为 UTF-8。这就是我正在做的解析 xml。
  • $data = base64_decode($data); $xml = simplexml_load_string($data); $xml 的值为 0。
  • 不应该打印吗? $str = '测试:Â';回声'
    文本:'。 $str; echo '
    BASE64 编码文本:' . base64_encode($str); echo '
    BASE64 解码文本:' . base64_decode(base64_encode($str));base64_decode(base64_encode($str));

标签: php xml encoding character-encoding


【解决方案1】:

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 细节并没有真正的经验,所以我不做任何保证......

【讨论】:

  • 他们直接使用法语字符À。他们将 xml 编码设置为 UTF-8。我正在尝试像这样解析 xml 数据,$xml = simplexml_load_string($data)。执行此行后,$xml 的值为 0。
  • 这里是一个示例 xml。我从他们那里得到的编码数据(java 应用程序)与我从 PHP base64_encode($xmlstr) 得到的编码字符串不同。
  • 你能检查一下 À 是编码为字节 0xC3 0x80 (utf-8) 还是 0xC0 (iso-8859-1)?
  • 你的意思是,像 ord($str[$i])?
  • 我想我遗漏了一些东西。编码数据看起来像这样 - 'PD94bWwgdmVyc...'。如果我对这个编码的字符串执行 echo ord($str[$i]),它会打印出 80、68、57、...,即 P、D、9 的 ascii 字符。我不认为这是你要我尝试的?
【解决方案2】:

什么是 XML 字符编码?也许不是UTF-8,而您的解析器正试图将XML 字符串解析为UTF-8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多