6

我正在从来自数据库(和一些 JSON 提要)的数据生成 XML。

我遇到了一些包含一些破坏我的 XML 的十六进制字符的文本的问题。

例如,查看我从 Chrome 获得的错误截图: XML 错误

我确定了给我带来问题的十六进制字符(我相信它们被称为控制字符)。这些是:

0x03
0x05
0x16
0x0E

在将这些字符打印到我的 XML 输出之前,如何用 PHP 替换这些字符?

谢谢!

4

4 回答 4

16

不仅仅是那些角色会破坏它......

preg_replace('/[\x00-\x1f]/', '?', $s);
于 2012-04-12T22:59:53.790 回答
4

您列出的字符确实是控制字符,都放在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);

希望这会有所帮助。

于 2012-04-12T23:24:39.670 回答
0

如果输入承诺是某个字符集,您可能可以使用其中一个字符集编码函数来保留尽可能多的数据(没有令人讨厌的缺失字符;没有它们,文本看起来会很混乱!)。utf8_encode 可能会对您有所帮助,但前提是您知道文本是 ISO-8859-1。否则,假设你已经安装了 iconv,你可能会更幸运。

在我看来,iconv 的最佳之处在于,如果您要从 UTF 向下转换为功能较弱的字符集,则能够使用音译。但是,如果您要编码为 UTF-8,您可能想要这样的东西:

$resultText = iconv("ISO-8859-1", "UTF-8//IGNORE", $inputText );
于 2012-04-12T23:21:41.673 回答
-1
preg_replace("/[[^0]\x03-[^0]\x05\-[^0]\x16-[^0]\x0E]/", '', $string);
于 2012-04-12T23:00:34.757 回答