在过去的 10 个小时里在互联网上搜索答案后,我遇到了一个无法解决的问题。
我有一些这种格式的数据
??E?�?0?�?<?20120529184453+0200?20120529184453+0200?�?�?G0E?5?=20111213T103134000-136.225.6.103-30365316-1448169323, ver: 12?�?W??tP?2?�? ??|????? ??:o?????tP?�??B@?????B@????�?�?)0?�??? 49471010550?�??	???tP???3??<?�?�?�?�??�?�?�?�?�??�?�?�?�?�
我有一个 PHP 代码,不是我写的,它只是在上面运行 html_entity_decode 并返回正确的结果。
当我尝试运行 Perl 的 decode_entities 时,我得到了完全不同的结果。经过一些调试,在我看来,PHP 正在“正确地”替换看似无效的实体,例如,�
或替换
为它们的 ascii 对应物,即提到的 2 种情况的 NULL 和退格键。
另一方面,Perl 似乎没有解码那些“无效”实体并将它们单独留下,后来一个搞砸了结果(通过 unpack 或在 phph 的情况下,bin2hex 失败,因为它不会将 null 解包为 00解包 ) 的每个单独的字符�
。
我已经尝试了所有我能想到的方法,包括在运行 decode_entities 之后在 perl 中运行以下替换
$var =~ s/&#(\d+);/chr($1)/g
然而,这根本不起作用。
这让我发疯了,我想在 perl 而不是 php 中完成这项工作我真的希望我不必在 perl 中编写 1000 行模式匹配行来涵盖所有可能的实体和数字。
任何人都知道如何解决这个问题,而不必将 PHP 的整个 html_entity_decode 函数解析为 perl 或编写无穷无尽的模式匹配行?