【问题标题】:Error: "Input is not proper UTF-8, indicate encoding !" using PHP's simplexml_load_string错误:“输入不是正确的 UTF-8,表示编码!”使用 PHP 的 simplexml_load_string
【发布时间】:2011-01-31 05:53:29
【问题描述】:

我收到了错误:

parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xED 0x6E 0x2C 0x20

尝试使用来自第 3 方来源的 simplexml_load_string 处理 XML 响应时。原始 XML 响应确实声明了内容类型:

<?xml version="1.0" encoding="UTF-8"?>

然而,XML 似乎并不是真正的 UTF-8。 XML 内容的语言是西班牙语,并且在 XML 中包含诸如 Dublín 之类的词。

我无法让第 3 方整理他们的 XML。

如何预处理 XML 并修复编码不兼容问题?

有没有办法检测 XML 文件的正确编码?

【问题讨论】:

    标签: php xml encoding character-encoding simplexml


    【解决方案1】:

    Erik 的提议解决了我所面临的问题 https://stackoverflow.com/a/4575802/14934277 实际上,这是了解您的数据是否可以打印的唯一方法。

    这里有一些对任何人都可能有用的代码:

    $product_desc = ..;
    //Filter your $product_desc here. Remove tags, strip, do all you would do to print XML
    try{(new SimpleXMLElement('<sth><![CDATA['.$product_desc.']]></sth>'))->asXML();}
    catch(Exception $exc) {$product_desc = '';}; //Don't print trash
    

    注意那部分。

    <![CDATA[]]>
    

    当您尝试从中创建 XML 时,请务必将其传递给浏览器将看到的最终产品,即使用 CDATA 包装您的字段

    【讨论】:

      【解决方案2】:

      如果您确定您的 xml 以 UTF-8 编码但包含错误字符,您可以使用此功能更正它们:

      $content = iconv('UTF-8', 'UTF-8//IGNORE', $content);
      

      【讨论】:

        【解决方案3】:

        我们最近遇到了类似的问题,但找不到任何明显的原因。原来我们的字符串中有一个控制字符,但是当我们将该字符串输出到浏览器时,该字符是不可见的,除非我们将文本复制到 IDE 中。 p>

        感谢this post,我们设法解决了我们的问题:

        preg_replace('/[\x00-\x1F\x7F]/', '', $input);

        【讨论】:

          【解决方案4】:

          经过几次尝试,我发现 htmlentities 功能有效。

          $value = htmlentities($value)
          

          【讨论】:

            【解决方案5】:

            我刚遇到这个问题。原来 XML 文件(不是内容)不是用 utf-8 编码的,而是用 ISO-8859-1 编码的。您可以在 Mac 上使用file -I xml_filename 进行检查。

            我用Sublime把文件编码改成utf-8,lxml导入没问题。

            【讨论】:

              【解决方案6】:

              在使用教义生成映射文件时,我遇到了同样的问题。我通过删除数据库中某些字段的所有 cmets 来修复它。

              【讨论】:

                【解决方案7】:

                您可以简单地将这行代码放在 mysql_connect 语句之后,而不是使用 javascript:

                mysql_set_charset('utf8',$connection);
                

                干杯。

                【讨论】:

                  【解决方案8】:

                  如果您下载 XML 文件并例如在 Notepad++ 中打开它,您会看到编码设置为 UTF8 以外的其他内容 - 我自己制作的 xml 也有同样的问题,这只是编辑器中的编码:)

                  String &lt;?xml version="1.0" encoding="UTF-8"?&gt; 不设置文档的编码,它只是验证器或其他资源的信息。

                  【讨论】:

                    【解决方案9】:

                    我解决了这个问题

                    $content = utf8_encode(file_get_contents('http://example.com/rss.xml'));
                    $xml = simplexml_load_string($content);
                    

                    【讨论】:

                    • 也为我工作,在我的情况下,XML 没有声明编码并且来自那些“企业”系统之一,所以无论如何都有奇怪的编码
                    • 我在使用 DOMDocument->load() 时遇到了同样的问题,这个解决方案工作正常,只需要在 file_get_contents 的结果上使用 ->loadXML
                    • 对我也有用!我正在使用 UTF-8 编码的 XML 文件中接收带有 ANSI 字符的文件。
                    • 为什么在内容之前使用 $,我有一个错误原因?
                    【解决方案10】:

                    您的 0xED 0x6E 0x2C 0x20 字节对应于 ISO-8859-1 中的“ín”,因此看起来您的内容是 ISO-8859-1,而不是 UTF-8。告诉你的数据提供者并要求他们修复它,因为如果它对你不起作用,它可能对其他人也不起作用。

                    现在有几种方法可以解决这个问题,如果您无法正常加载 XML,则应该使用这些方法。其中之一是使用utf8_encode()。不利的一面是,如果该 XML 包含有效的 UTF-8 和一些 ISO-8859-1,那么结果将包含 mojibake。或者您可以尝试使用 iconv() 或 mbstring 将字符串从 UTF-8 转换为 UTF-8,并希望他们会为您修复它。 (他们不会,但您至少可以忽略无效字符,以便加载您的 XML)

                    或者您可以走很长很长的路,自己验证/修复序列。这将花费您一段时间,具体取决于您对 UTF-8 的熟悉程度。也许那里有图书馆可以做到这一点,虽然我不知道。

                    无论哪种方式,请通知您的数据提供商他们正在发送无效数据,以便他们进行修复。


                    这是部分修复。它肯定不会解决所有问题,但会解决一些问题。希望足以让您度过难关,直到您的提供商修复他们的东西。

                    function fix_latin1_mangled_with_utf8_maybe_hopefully_most_of_the_time($str)
                    {
                        return preg_replace_callback('#[\\xA1-\\xFF](?![\\x80-\\xBF]{2,})#', 'utf8_encode_callback', $str);
                    }
                    
                    function utf8_encode_callback($m)
                    {
                        return utf8_encode($m[0]);
                    }
                    

                    【讨论】:

                    • 这很有帮助。我能够通过使用 utf8_encode() 来修复 XML。你能告诉我你是如何破译字符串0xED 0x6E 0x2C 0x20的编码的吗?
                    • ISO-8859-1 在西方世界被广泛使用。如果不是 UTF-8,通常是 ISO-8859-1。 (或cp1252)至于每个字节的值,我只是查了一下char表。
                    【解决方案11】:

                    您能否在 Firefox 中打开第 3 方 XML 源并查看它自动检测到的编码内容?也许他们正在使用普通的旧 ISO-8859-1、UTF-16 或其他东西。

                    但是,如果他们将其声明为 UTF-8,并提供其他内容,那么他​​们的提要显然已损坏。在这样一个损坏的提要上工作对我来说感觉很糟糕(尽管有时是不可避免的,我知道)。

                    如果是“UTF-8 与 ISO-8859-1”这样的简单案例,您也可以使用mb_detect_encoding() 试试运气。

                    【讨论】:

                    • mb_detect_encoding() 表示内容是 UTF-8,但如果它是有效的 UTF-8,XML 解析器会抱怨它吗?
                    • @Camsoft 奇怪。你能用火狐试试吗?你能把它归结为造成问题的角色吗?您是否可以将 URL 发布到 XML 提要?
                    猜你喜欢
                    • 2013-12-13
                    • 1970-01-01
                    • 2011-06-07
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-02-29
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多