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