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