PHP 使用 SimpleXML、DOMDocument 或 XMLReader 解析 XML 時,拋出 Invalid byte 1 of 1-byte UTF-8 sequence 錯誤,核心原因是文件實際編碼與 XML 聲明編碼不一致。
<?xml version="1.0" encoding="UTF-8"?>。0xC4 0xE3),解析器按 UTF-8 解讀時,首字節 0xC4 屬於 UTF-8 多字節序列的引導字節,但後續字節不符合 UTF-8 規則,導致 "Invalid byte 1" 錯誤。若聲明 encoding="GBK" 或 encoding="GB2312",解析器按 GBK 解碼,字節序列合法,解析通過。但這掩蓋了實際問題:文件編碼與聲明不一致。
適用於無法控制文件生成源頭(如第三方接口)的場景。
iconv -f GBK -t UTF-8 input.xml > output.xml
$content = file_get_contents('input.xml');
$content = iconv('GBK', 'UTF-8//IGNORE', $content);
// 修正聲明
$content = preg_replace('/encoding=["\']GBK["\']/i', 'encoding="UTF-8"', $content);
file_put_contents('output.xml', $content);
$xmlStr = file_get_contents('data.xml');
// 1. 去除 BOM
$xmlStr = preg_replace('/^\xEF\xBB\xBF/', '', $xmlStr);
// 2. 檢測編碼並轉換
$encoding = mb_detect_encoding($xmlStr, ['UTF-8', 'GBK', 'GB2312', 'ASCII']);
if ($encoding !== 'UTF-8') {
$xmlStr = iconv($encoding, 'UTF-8//IGNORE', $xmlStr);
// 同步修正聲明
$xmlStr = preg_replace('/encoding=["\'](?i:GBK|GB2312)["\']/', 'encoding="UTF-8"', $xmlStr);
}
// 3. 解析
$xml = simplexml_load_string($xmlStr);
原因:XML 文件末尾存在多餘空白字符(換行、空格)、BOM 或非法字符。
解決:解析前 trim() 字符串,或去除 BOM:
$xmlStr = trim($xmlStr); // 去除首尾空白
$xmlStr = preg_replace('/^\xEF\xBB\xBF/', '', $xmlStr); // 去除 UTF-8 BOM
SAXReader reader = new SAXReader();
Document document = reader.read("D:/ha.xml");
OutputFormat format = new OutputFormat();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileWriter("d:/dom4j.xml"), format);
writer.write(document);
writer.close();
encoding="UTF-8"。Content-Type: application/xml; charset=UTF-8。編碼問題看似瑣碎,實則是數據完整性的基石。建立統一的 UTF-8 全鏈路規範,才能徹底告別 "Invalid byte" 等疑難雜症。