PHP中的htmlspecialchars完全在XML输出中省略了数据

时间:2014-04-03 11:40:29

标签: php xml rss

我有一个MySQL查询,它返回格式化为XML文件的数据。其中一列是一个自由文本字段,可以包含使用编码错误“中断”XML的奇怪字符。我相信这些字符是一个奇怪的“引号”,当用户最初输入记录时,它会粘贴到粘贴的Microsoft Word中。我无法控制该过程。

奇怪的角色示例:

“TURN KEY – Totally Furnished†

我正在使用htmlspecialchars来“清理”这些数据,它基本上完全从XML记录中删除该字段,并使该记录空白。这解决了编码问题,但该记录现在缺少该字段的数据。我仍然想要那些数据,我只是想省略甚至将奇怪的字符改成像破折号一样。

$description  = htmlspecialchars($row['PropertyInformation'], ENT_QUOTES, 'UTF-8');

XML输出在发生奇怪字符的记录中以这样结束:

<DESCRIPTIF>
<![CDATA[ ]]>
</DESCRIPTIF>

3 个答案:

答案 0 :(得分:1)

看起来你忘了把utf-8

大写

$description = htmlspecialchars($row['PropertyInformation'], ENT_QUOTES, 'UTF-8');

答案 1 :(得分:1)

如果输入字符串在给定编码中包含无效的代码单元序列,htmlspecialchars函数将返回空字符串,除非设置了ENT_IGNOREENT_SUBSTITUTE标志。

ENT_IGNORE标志以静默方式丢弃无效的代码单元序列,而不是返回空字符串。不鼓励使用此标志,因为它可能具有安全隐患。

ENT_SUBSTITUTE falg用Unicode替换字符U + FFFD(UTF-8)或&amp; #FFFD替换无效代码单元序列; (否则)而不是返回一个空字符串。

您可以尝试设置其中一个标志。

htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE);

答案 2 :(得分:1)

/**
 * Clean a string from non-printable chars
 * 
 * @param string $string
 * @return string
 */
function str_clean($string)
{
    return preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $string);
}


$string = '“TURN KEY – Totally Furnishedâ€';
echo htmlspecialchars(str_clean($string), ENT_QUOTES, 'UTF-8');