htmlentities'无效多字节序列'错误

时间:2010-02-24 15:38:57

标签: php

在尝试通过PHP的htmlentities函数运行字符串时,我遇到了一些“无效多字节序列”错误的情况。有没有办法在调用函数之前清理字符串以防止发生此错误?

7 个答案:

答案 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_HTML401ENT_XHTMLENT_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进行调试时出现这些错误。

I got the information from here

答案 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