在PHP中将此十六进制字符替换为字符串

时间:2012-04-12 22:55:41

标签: php character-encoding replace preg-replace hex

我正在从来自数据库(以及一些JSON供稿)的数据生成XML。

我的一些文本存在一些问题,这些文本包含一些破坏我的XML的十六进制字符。

例如,请参阅我从Chrome获得的错误的屏幕截图: XML error

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

0x03
0x05
0x16
0x0E

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

谢谢!

4 个答案:

答案 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);