PHP如何将XML中非UTF-8编码转UTF-8及实现反向转换
PHP实现XML实体与UTF-8字符互转方案
正向转换:XML实体转UTF-8明文
你遇到的是XML中十六进制字符实体的解码场景,PHP可通过以下两种常用方案实现转换:
- 方案1:使用
html_entity_decode(兼容性更好)
// 原始XML字符串 $rawStr = ""Schwäbisch Hall Unicorns""; // 两次解码:第一次还原转义的&符号,第二次转换所有XML实体为UTF-8字符 $utf8Str = html_entity_decode( html_entity_decode($rawStr, ENT_QUOTES | ENT_XML1, 'UTF-8'), ENT_QUOTES | ENT_XML1, 'UTF-8' ); // 输出结果:"Schwäbisch Hall Unicorns"
参数说明:
ENT_QUOTES:同时解码单引号和双引号实体ENT_XML1:按照XML 1规范处理实体,适配XML场景明确指定
UTF-8作为输出编码,避免不同PHP版本的默认编码差异导致乱码方案2:使用
mb_convert_encoding(写法更简洁)
$rawStr = ""Schwäbisch Hall Unicorns""; $utf8Str = mb_convert_encoding($rawStr, 'UTF-8', 'HTML-ENTITIES');
该方案会自动识别所有十进制、十六进制的HTML/XML实体,直接转换为UTF-8字符。
反向转换:UTF-8明文转XML实体
如果需要将UTF-8字符转换回XML实体格式,可使用以下方案:
- 方案1:通用XML实体编码
$utf8Str = ""Schwäbisch Hall Unicorns""; $xmlStr = htmlentities($utf8Str, ENT_QUOTES | ENT_XML1, 'UTF-8'); // 输出结果包含对应实体,兼容XML规范
- 方案2:输出与原始格式完全一致的十六进制实体
$utf8Str = "Schwäbisch Hall Unicorns"; // 所有非ASCII字符转为十六进制数字实体 $xmlStr = preg_replace_callback('/[^\x00-\x7F]/u', function($matches) { return '&#x' . dechex(mb_ord($matches[0])) . ';'; }, $utf8Str); // 额外将&转义为&,匹配原始XML的转义层级 $xmlStr = str_replace('&', '&', $xmlStr);
内容的提问来源于stack exchange,提问作者Basti
相关产品推荐
相关产品推荐

