我最近一直在大量使用SimpleXML,并且多次遇到字符编码问题。基本上,如果一个字符串混合了UTF-8和非UTF-8字符,SimpleXML就会报错,声称“字符串无法解析为XML”。
我尝试了很多解决方案,希望通过mbstringINI设置实现自动化;这些计划都失败了。iconv无法正常工作。唯一可行的是将编码转换为latin1——但这对实际的UTF-8字符造成了严重破坏。
然后,通过一系列反复试验、全有或全无的尝试,我偶然发现了一个简单的解决方案。基本上,我需要采取两个步骤:
- 检测字符串的当前编码
- 将该编码转换为UTF-8
这是通过以下方式完成的:
$enc = mb_detect_encoding($xml); $xml = mb_convert_encoding($xml, 'UTF-8', $enc);
即使检测到的编码是UTF-8也会进行转换;转换确保字符串中的所有字符在完成时都被正确编码。
这是一个不直观的解决方案,但它确实有效!QED.