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

GSt*_*Sto 13 php

在尝试通过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_XHTMLENT_XML1.

使用这些选项可以确保结果在给定的doctype中始终有效,无论您获得哪种输入.

另外,不要忘记指定$stringEncoding.依赖于默认值是一个坏主意,因为它取决于ini设置,并且可能(并且确实)在版本之间进行更改.

  • @Lekensteyn`ENT_HTML5`不是多余的,特别是当使用`ENT_DISALLOWED`时.它将使用Unicode替换字符替换HTML5 doctype中无效的代码点.例如,请看这个例子:http://codepad.viper-7.com/q5bPMQ`ENT_HTML5 | ENT_DISALLOWED`确保输出不包含任何无效的代码点. (3认同)

Edd*_*die 9

我遇到过这样的情况:仅指定UTF-8并且发现ENT_IGNORE选项很有用.我不认为它是针对htmlentities记录的,仅适用于htmlspecialchars,但它确实可以解决错误.

  • 我知道这是一个古老的话题,但我也遇到过这个问题,并且认为不建议使用ENT_IGNORE,因为它可能会产生安全隐患:http://unicode.org/reports/tr36/#Deletion_of_Noncharacters (3认同)

Pek*_*ica 8

对于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打开调试期间无法检测到这些错误.

我从这里得到了信息