我有一个MySQL查询,它返回格式化为XML文件的数据。其中一列是一个自由文本字段,可以包含使用编码错误“中断”XML的奇怪字符。我相信这些字符是一个奇怪的“引号”,当用户最初输入记录时,它会粘贴到粘贴的Microsoft Word中。我无法控制该过程。
奇怪的角色示例:
“TURN KEY – Totally Furnishedâ€
我正在使用htmlspecialchars来“清理”这些数据,它基本上完全从XML记录中删除该字段,并使该记录空白。这解决了编码问题,但该记录现在缺少该字段的数据。我仍然想要那些数据,我只是想省略甚至将奇怪的字符改成像破折号一样。
$description = htmlspecialchars($row['PropertyInformation'], ENT_QUOTES, 'UTF-8');
XML输出在发生奇怪字符的记录中以这样结束:
<DESCRIPTIF>
<![CDATA[ ]]>
</DESCRIPTIF>
答案 0 :(得分:1)
看起来你忘了把utf-8
大写 $description = htmlspecialchars($row['PropertyInformation'], ENT_QUOTES, 'UTF-8');
答案 1 :(得分:1)
如果输入字符串在给定编码中包含无效的代码单元序列,htmlspecialchars
函数将返回空字符串,除非设置了ENT_IGNORE
或ENT_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');