在尝试通过PHP的htmlentities函数运行字符串时,我遇到了一些"无效多字节序列"错误的情况.有没有办法在调用函数之前清理字符串以防止发生此错误?
Nik*_*kiC 10
从PHP 5.4开始,您应该使用以下内容来正确转义输出:
$escapedString = htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_DISALLOWED | ENT_HTML5, $stringEncoding);
Run Code Online (Sandbox Code Playgroud)
ENT_SUBSTITUTE 用repla替换无效的代码单元序列(而不是返回空字符串).
ENT_DISALLOWED 用 替换指定doctype中无效的代码点.
ENT_HTML5指定使用的doctype.根据您使用的内容,您可以选择ENT_HTML401,ENT_XHTML或ENT_XML1.
使用这些选项可以确保结果在给定的doctype中始终有效,无论您获得哪种输入.
另外,不要忘记指定$stringEncoding.依赖于默认值是一个坏主意,因为它取决于ini设置,并且可能(并且确实)在版本之间进行更改.
我遇到过这样的情况:仅指定UTF-8并且发现ENT_IGNORE选项很有用.我不认为它是针对htmlentities记录的,仅适用于htmlspecialchars,但它确实可以解决错误.
对于PHP 5.3.0及更低版本,默认字符集为htmlentities() ISO-8859-1.(手动)
您可能正在将其应用于UTF-8字符串.使用指定字符集
htmlentities($string, (whatever), "UTF-8");
Run Code Online (Sandbox Code Playgroud)
从PHP 5.4.0开始,默认字符集为UTF-8.
小智 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打开调试期间无法检测到这些错误.