代码之家  ›  专栏  ›  技术社区  ›  Camsoft

错误:“输入不正确的utf-8,表示编码!“使用php的simplexml加载字符串

  •  55
  • Camsoft  · 技术社区  · 16 年前

    我发现了错误:

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

    当尝试使用 simplexml_load_string 来自第三方。原始XML响应确实声明了内容类型:

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

    然而,看起来xml并不是真正的utf-8。XML内容的语言是西班牙语,包含如下单词 Dublín 在XML中。

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

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

    是否有方法检测XML文件的正确编码?

    10 回复  |  直到 9 年前
        1
  •  71
  •   Josh Davis    16 年前

    您的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,希望他们能帮你修好。(不会,但至少可以忽略无效字符,以便加载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]);
    }
    
        2
  •  46
  •   Erik    15 年前

    我是用

    $content = utf8_encode(file_get_contents('http://example.com/rss.xml'));
    $xml = simplexml_load_string($content);
    
        3
  •  11
  •   befox    12 年前

    如果确定XML是用UTF-8编码的,但包含错误字符,则可以使用此函数更正它们:

    $content = iconv('UTF-8', 'UTF-8//IGNORE', $content);
    
        4
  •  4
  •   Community Mohan Dere    9 年前

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

    我们设法解决了我们的问题,多亏了 this post 而这:

    preg_replace('/[\x00-\x1f\x7f]/','',$输入);

        5
  •  3
  •   Chango    15 年前

    不用javascript,只需将这一行代码放在mysql连接语句之后:

    mysql_set_charset('utf8',$connection);
    

    干杯。

        6
  •  2
  •   Pekka    16 年前

    您能在firefox中打开第三方xml源代码并查看它自动检测到的编码吗?也许他们用的是普通的旧ISO-8859-1,UTF-16或其他什么。

    不过,如果他们宣布它是utf-8,并提供其他服务,他们的饲料显然是坏的。在这样一个坏掉的饲料周围工作对我来说很可怕(尽管有时不可避免,我知道)。

    如果是“utf-8与iso-8859-1”这样的简单例子,你也可以试试运气 mb_detect_encoding() .

        7
  •  2
  •   skr    15 年前

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

    <?xml version="1.0" encoding="UTF-8"?> 不要设置文档的编码,它只是验证程序或其他资源的信息。

        8
  •  1
  •   George John    9 年前

    经过几次尝试,我发现htmlenties函数可以工作。

    $value = htmlentities($value)
    
        9
  •  0
  •   Tim Lieberman    9 年前

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

        10
  •  0
  •   paragbaxi    9 年前

    我刚遇到这个问题。原来XML文件(不是内容)不是用UTF-8编码的,而是用ISO-8859-1编码的。你可以在Mac电脑上用 file -I xml_filename .

    我使用sublime将文件编码更改为utf-8,lxml导入它没有问题。