0

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

我使用像“ä”、“ü”和“ö”这样的字符。我收到以下错误:

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

4

2 回答 2

0

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

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

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

然后,您可以将其转换为 UTF-8将编码注入 XML 字符串,这很容易通过XMLRecoder- 检查和修改基于 XML 声明和 BOM 的 XML 文档的字符编码。它的一部分在PHP XMLReader 中进行了解释,获取关于 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 编码以及可用的字符集编码和名称,请参阅:

于 2013-09-19T13:56:03.497 回答
0

PHP 5 和更早的版本没有原生的 Unicode 支持。承诺支持 Unicode 的 PHP 6 或 7 可能需要数年时间。为了弥补差距,存在几个扩展,如 mbstring、iconv 和 intl。

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

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

还要检查 XML 文件序言是否包含正确的编码,例如

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

假设这一切都是正确的,看起来 xml 文件声称是 UTF-8 但实际上是其他东西(可能是 latin1 或 ISO-8859-1 或Mojibake。)。您可以在您喜欢的编辑器(我喜欢Sublime )中手动打开 XML 文件,并使用 UTF8 编码显式保存文件。或者您可以使用函数在加载之前尝试修改字符串。就像来自:错误:“输入不是正确的 UTF-8,指示编码!” 使用 PHP 的 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 - 一个用于 PHP 中 Unicode 处理的轻量级库

于 2013-09-19T13:10:42.577 回答