2010-02-24 105 views
13

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

回答

8

对于PHP 5.3.0及更低版本,htmlentities()的默认字符集是ISO-8859-1。 (Manual

您可能将其应用于UTF-8字符串。指定使用的字符集

htmlentities($string, (whatever), "UTF-8"); 

自PHP 5.4.0起,默认字符集是UTF-8。

9

我遇到过不足以指定UTF-8并发现ENT_IGNORE选项有用的情况。我不认为它是为htmlentities记录的,只是针对htmlspecialchars,但它确实有效扼杀了错误。

+2

我知道这是一个老话题,但我碰到这个问题也来了,并认为这可能是值得注意的是,不建议使用ENT_IGNORE的,因为它可能带来安全隐患: http://unicode.org/reports/tr36/#Deletion_of_Noncharacters – Dean 2012-03-09 07:26:17

+0

是的,ENT_IGNORE是我目前发现的唯一修复程序(/ hack)。 – Kzqai 2012-07-24 18:35:42

6

一般来说PHP的INI display_errors设置可被用于控制 差错是否是输出到浏览器中,INI设定log_errors 可以独立使用,以控制错误是否被写入到 日志文件,并且如果自定义错误处理程序已设置为 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

+0

感谢您指出这一点 - 它解释了为什么我只看到生产中的这个错误!我无法弄清楚为什么在我的开发箱中,所有的错误报告都是在_ON_上,我无法重现错误。 – thaddeusmt 2014-01-03 21:41:09

2

你要检查字符串中的某处使用SUBSTR。我建议然后使用mb_substr作为替代。 问题是substr不能识别unicode。所以,它只是斩掉多字节字符集中的字节。

8

由于PHP 5.4,你应该使用的东西沿着以下正确转义输出:

$escapedString = htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_DISALLOWED | ENT_HTML5, $stringEncoding); 

ENT_SUBSTITUTE的(而不是返回一个空字符串)替换无效的代码单元序列。

ENT_DISALLOWED用 替换指定文档类型中无效的代码点。

ENT_HTML5指定使用的文档类型。根据您的使用情况,您可以选择ENT_HTML401ENT_XHTMLENT_XML1

使用这些选项,您可以确保结果在给定的文档类型中始终有效,而不管您获得的提名输入的种类。

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

+0

PHP文档对此不清楚,但对于htmlspecialchars,“ENT_HTML5”是多余的。请参阅http://stackoverflow.com/a/14532168/427545 – Lekensteyn 2013-01-26 00:29:18

+3

@Lekensteyn'ENT_HTML5'不是多余的,特别是当使用'ENT_DISALLOWED'时。它将用Unicode替换字符替换HTML5 doctype中无效的代码点。例如。看到这个例子:http://codepad.viper-7.com/q5bPMQ'ENT_HTML5 | ENT_DISALLOWED'确保输出不包含任何无效的代码点。 – NikiC 2013-01-26 13:37:47

+0

感谢您的纠正,我已经扩大了我的答案,将无效字符考虑在内。起初,我不知道DISALLOWED和SUBTITUTE之间的区别,但现在已经清楚了。 – Lekensteyn 2013-01-26 15:11:46

-1

html_entities($ variable,ENT_QUOTES);对我来说总是很好。

+0

某些版本的PHP中的默认编码是iso-something-something,并且仅在php 5.4中才是utf-8。请注意,无论在版本中它是不一致的,所以最好指定编码以匹配实际使用的编码。 – Kzqai 2012-07-30 12:55:41

-2

请注意,使用utf-8需要启用多字节字符串函数。这可能意味着使用mb_substr替换substr之类的函数,只是php提供了一个php ini设置来打开这些函数与mb等效的重载。

在这里看到更多的细节:http://www.php.net/manual/en/mbstring.overload.php

相关问题