从xml文件中读取特定字符到php文件

时间:2013-09-19 12:45:30

标签: php xml character-encoding simplexml

当我从XML文件中读取特定字符到PHP文件时,我遇到了问题。

我使用“ä”,“ü”和“ö”等字符。我收到以下错误:

  

simplexml_load_string()[function.simplexml-load-string]:实体:第96行:解析器错误:输入不正确UTF-8,表示编码!       字节:0xFC 0x73 0x65 0x0C

2 个答案:

答案 0 :(得分:0)

PHP 5及更早版本没有本机Unicode支持。 PHP 6或7,承诺提供Unicode支持,可能需要数年时间。为弥合差距,存在几个扩展,如mbstring,iconv和intl。

确保使用适当的内容类型和编码发送HTML响应,例如

<?php header('Content-Type: text/html; charset=utf-8');?>

同时检查XML文件prolog是否包含正确的编码,例如

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

假设一切正确,似乎xml文件声称是UTF-8,但实际上是其他东西(可能是latin1或ISO-8859-1或Mojibake。)。您可以在您喜欢的编辑器中手动打开XML文件(我喜欢Sublime)并使用UTF8编码显式保存文件。或者您可以使用函数在加载前尝试修改字符串。就像来自Error: "Input is not proper UTF-8, indicate encoding !" using PHP's simplexml_load_string

的那个
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]);
}

但是在一天结束的时候,它会变得很混乱,PHP似乎仍然没有像我们所希望的那样处理Unicode,而且它根本就没有内置到核心中。

我们建议您查看Portable UTF-8 - a Lightweight Library for Unicode Handling in PHP

答案 1 :(得分:0)

您获得的XML字符串未正确编码。默认编码为UTF-8,但您获得的字符串不同,很可能是Windows-1252

如果您希望该错误消失,则需要将该字符串(通过问题中缺少的信息:)未知编码重新编码为UTF-8。

如果未知的编码被破坏,您需要首先找出/了解字符串的编码。

然后您可以将其转换为UTF-8 将编码注入XML字符串,这可以通过XMLRecoder - Inspect and modify character encoding of an XML document based on XML Declaration and BOM轻松实现。部分内容在PHP XMLReader, get the version and encoding中解释,它与XMLReader有关,但与SimpleXML类似,它也是基于libxml的PHP XML扩展,并且共享一些公共内容,因此可行。

用法示例:

$buffer = file_get_contents($file);

$fromEncoding = 'WINDOWS-1252';  # insert *your* correct string encoding here

$recoder = new XMLRecoder();
$buffer  = $recoder->setEncodingDeclaration($buffer, $fromEncoding);

$sxml = simplexml_load_string($buffer);

为了更好地理解PHP中的XML编码以及可用的字符集编码和名称,请参阅: