我正在从来自数据库(和一些 JSON 提要)的数据生成 XML。
我遇到了一些包含一些破坏我的 XML 的十六进制字符的文本的问题。
例如,查看我从 Chrome 获得的错误截图:
我确定了给我带来问题的十六进制字符(我相信它们被称为控制字符)。这些是:
0x03
0x05
0x16
0x0E
在将这些字符打印到我的 XML 输出之前,如何用 PHP 替换这些字符?
谢谢!
我正在从来自数据库(和一些 JSON 提要)的数据生成 XML。
我遇到了一些包含一些破坏我的 XML 的十六进制字符的文本的问题。
例如,查看我从 Chrome 获得的错误截图:
我确定了给我带来问题的十六进制字符(我相信它们被称为控制字符)。这些是:
0x03
0x05
0x16
0x0E
在将这些字符打印到我的 XML 输出之前,如何用 PHP 替换这些字符?
谢谢!
不仅仅是那些角色会破坏它......
preg_replace('/[\x00-\x1f]/', '?', $s);
您列出的字符确实是控制字符,都放在C0 集中:
0x03 - ETX End of Text
0x05 - ENQ Enquiry
0x0E - SO Shift Out
0x16 - SYN Synchronous Idle
您应该验证这些字符是如何进入字符串的。我真的不建议删除它们(如果您打算删除它们,请至少使用一个替换字符,不要只删除它们),但在这里要保守一些,因为它们不是无效的 unicode,只需将它们转换为数字实体(这也已成功完成):
$pairs = array(
"\x03" => "",
"\x05" => "",
"\x0E" => "",
"\x16" => "",
);
$xml = strtr($xml, $pairs);
希望这会有所帮助。
如果输入承诺是某个字符集,您可能可以使用其中一个字符集编码函数来保留尽可能多的数据(没有令人讨厌的缺失字符;没有它们,文本看起来会很混乱!)。utf8_encode 可能会对您有所帮助,但前提是您知道文本是 ISO-8859-1。否则,假设你已经安装了 iconv,你可能会更幸运。
在我看来,iconv 的最佳之处在于,如果您要从 UTF 向下转换为功能较弱的字符集,则能够使用音译。但是,如果您要编码为 UTF-8,您可能想要这样的东西:
$resultText = iconv("ISO-8859-1", "UTF-8//IGNORE", $inputText );
preg_replace("/[[^0]\x03-[^0]\x05\-[^0]\x16-[^0]\x0E]/", '', $string);