当我从 XML 文件读取特定字符到 PHP 文件时遇到问题。
我使用像“ä”、“ü”和“ö”这样的字符。我收到以下错误:
simplexml_load_string() [function.simplexml-load-string]:实体:第 96 行:解析器错误:输入不正确的 UTF-8,表示编码!字节:0xFC 0x73 0x65 0x0C
当我从 XML 文件读取特定字符到 PHP 文件时遇到问题。
我使用像“ä”、“ü”和“ö”这样的字符。我收到以下错误:
simplexml_load_string() [function.simplexml-load-string]:实体:第 96 行:解析器错误:输入不正确的 UTF-8,表示编码!字节:0xFC 0x73 0x65 0x0C
您获得的 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 编码以及可用的字符集编码和名称,请参阅:
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,而且它根本没有内置到核心中。