在尝试通过PHP的htmlentities函数运行字符串时,我遇到了一些“无效多字节序列”错误的情况。有没有办法在调用函数之前清理字符串以防止发生此错误?
答案 0 :(得分:10)
从PHP 5.4开始,您应该使用以下内容来正确转义输出:
$escapedString = htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_DISALLOWED | ENT_HTML5, $stringEncoding);
ENT_SUBSTITUTE
用�替换无效的代码单元序列(而不是返回空字符串)。
ENT_DISALLOWED
将指定doctype中无效的代码点替换为�。
ENT_HTML5
指定使用的doctype。根据您的使用情况,您可以选择ENT_HTML401
,ENT_XHTML
或ENT_XML1
。
使用这些选项,您可以确保结果在给定的doctype中始终有效,无论您获得哪种恶意输入。
另外,不要忘记指定$stringEncoding
。依赖于默认值是一个坏主意,因为它取决于ini
设置,并且可能(并且确实)在版本之间进行更改。
答案 1 :(得分:9)
我遇到过指定UTF-8并且发现ENT_IGNORE选项有用的情况。我不认为它是针对htmlentities记录的,仅适用于htmlspecialchars,但它确实可以解决错误。
答案 2 :(得分:8)
对于PHP 5.3.0及更低版本,htmlentities()
的默认字符集是ISO-8859-1。 (Manual)
您可能正在将其应用于UTF-8字符串。使用
指定字符集htmlentities($string, (whatever), "UTF-8");
自PHP 5.4.0起,默认字符集为UTF-8。
答案 3 :(得分:6)
一般情况下,php ini设置display_errors可用于控制 是否将错误输出到浏览器,ini设置log_errors 可以独立用于控制是否写入错误 logfile,如果已设置自定义错误处理程序 set_error_handler()然后总是调用所有错误并且可以 然后读取display_errors和log_errors的值以及 error_reporting()的值并采取适当的行动, 正确?
<强>错误!在这种情况下,如果display_errors的值为false,则htmlspecialchars()和htmlentities()仅触发错误。如果 display_errors的值为true,则根本不会触发任何错误! 这种看似荒谬的行为使人们无法察觉 使用display_errors进行调试时出现这些错误。
答案 4 :(得分:2)
您是否在要检查的字符串中的某处使用substr。我建议然后使用mb_substr作为替代。 问题是substr不是unicode。因此,它只是切断多字节字符集中的字节。
答案 5 :(得分:-1)
html_entities($ variable,ENT_QUOTES);对我来说总是很好。
答案 6 :(得分:-2)
请注意,使用utf-8需要启用多字节字符串函数。这可能意味着用mb_substr替换substr等函数,除了php提供了一个php ini设置来打开这些函数的重载与mb等效。
有关详情,请参阅此处:http://www.php.net/manual/en/mbstring.overload.php