【问题标题】:PHP XML throws error on Latin-1 encodingPHP XML 在 Latin-1 编码上抛出错误
【发布时间】:2011-06-03 21:14:20
【问题描述】:

只是一个小问题,但我注意到如果我的 xml 的第一行有 encoding="Latin-1" 那么 php simplexml 和 dom 将抛出错误并拒绝导入。我做了一个解决方法,我将 xml 作为字符串导入并将正则表达式 encoding="Latin-1" 导入到 encoding="ISO-8859-1" 中,然后再加载到不会引发错误的对象中,但我想知道是否有更优雅的解决方案?最好是 dom 对象内部的东西,这样我就可以从文件名中导入。

【问题讨论】:

  • 我相信您的重写解决方法已经是合适的解决方案。字符集名称没有“Latin-1”别名。 iana.org/assignments/character-sets
  • 我正在处理一个非常大的数据集,它的格式并不总是完美,所以如果有办法抑制无法识别的编码错误和无论如何加载文件会很棒。我还没有发现如何/如果可能的话。
  • libxml 的 PHP 接口只提供了LIBXML_NOWARNING,这里没有帮助。即使有抑制实际错误的选项(我对此表示怀疑),它也不会在 PHP 方法中公开。
  • 哦,好吧,谢谢,至少我可以停止用头撞墙,开始思考一些有用的事情。

标签: php xml xml-parsing


【解决方案1】:

要使用 simple_xml 和其他 php xml 函数和类,您将 xml 编码为 UTF-8,请使用 utf8_encode(xmlstring)。如果您的 xml 有一个简单的英文字符串,没有特殊字符相同的 ú、í、á、ü 等,则无需重新编码即可使用,但如果您有这些字符或相似的字符,则需要使用 utf8_encode 进行编码

【讨论】:

  • 错误不是它不是 UTF-8 编码的事实,而是 xml 告诉 simple_xml 它是 Latin-1 编码的,而 simple_xml 无法识别该编码格式。
【解决方案2】:

对于任何感兴趣的人,这是解决方法的代码:

if ($xml_file_handle = fopen($xml_file_path, "r")) {
    $xml_data = fread($xml_file_handle, filesize($xml_file_path));
    fclose($file_handle);

    $xml_data = preg_replace("/encoding=\"Latin-1\"/i", "encoding=\"ISO-8859-1\"", $xml_data);

    $dom = new DOMDocument();
    $dom->loadXML($xml_data);

    // Do stuff with $dom
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2013-06-11
    • 2015-09-06
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2019-12-09
    相关资源
    最近更新 更多