当试图通过PHP的htmlentities函数运行字符串时,我有一些情况下,我得到'无效的多字节序列'错误。有没有办法在调用函数之前清理字符串以防止发生此错误?htmlentities'无效的多字节序列'错误
回答
对于PHP 5.3.0及更低版本,htmlentities()
的默认字符集是ISO-8859-1。 (Manual)
您可能将其应用于UTF-8字符串。指定使用的字符集
htmlentities($string, (whatever), "UTF-8");
自PHP 5.4.0起,默认字符集是UTF-8。
我遇到过不足以指定UTF-8并发现ENT_IGNORE选项有用的情况。我不认为它是为htmlentities记录的,只是针对htmlspecialchars,但它确实有效扼杀了错误。
一般来说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进行调试期间无法检测到 这些错误。
感谢您指出这一点 - 它解释了为什么我只看到生产中的这个错误!我无法弄清楚为什么在我的开发箱中,所有的错误报告都是在_ON_上,我无法重现错误。 – thaddeusmt 2014-01-03 21:41:09
你要检查字符串中的某处使用SUBSTR。我建议然后使用mb_substr作为替代。 问题是substr不能识别unicode。所以,它只是斩掉多字节字符集中的字节。
由于PHP 5.4,你应该使用的东西沿着以下正确转义输出:
$escapedString = htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_DISALLOWED | ENT_HTML5, $stringEncoding);
ENT_SUBSTITUTE
的(而不是返回一个空字符串)替换无效的代码单元序列。
ENT_DISALLOWED
用 替换指定文档类型中无效的代码点。
ENT_HTML5
指定使用的文档类型。根据您的使用情况,您可以选择ENT_HTML401
,ENT_XHTML
或ENT_XML1
。
使用这些选项,您可以确保结果在给定的文档类型中始终有效,而不管您获得的提名输入的种类。
此外,不要忘记指定$stringEncoding
。依赖于默认值是一个坏主意,因为它取决于ini
设置,并且可能(并且确实)在版本之间改变。
PHP文档对此不清楚,但对于htmlspecialchars,“ENT_HTML5”是多余的。请参阅http://stackoverflow.com/a/14532168/427545 – Lekensteyn 2013-01-26 00:29:18
@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
感谢您的纠正,我已经扩大了我的答案,将无效字符考虑在内。起初,我不知道DISALLOWED和SUBTITUTE之间的区别,但现在已经清楚了。 – Lekensteyn 2013-01-26 15:11:46
html_entities($ variable,ENT_QUOTES);对我来说总是很好。
某些版本的PHP中的默认编码是iso-something-something,并且仅在php 5.4中才是utf-8。请注意,无论在版本中它是不一致的,所以最好指定编码以匹配实际使用的编码。 – Kzqai 2012-07-30 12:55:41
请注意,使用utf-8需要启用多字节字符串函数。这可能意味着使用mb_substr替换substr之类的函数,只是php提供了一个php ini设置来打开这些函数与mb等效的重载。
在这里看到更多的细节:http://www.php.net/manual/en/mbstring.overload.php
- 1. msgfmt波兰文字“无效多字节序列”错误
- 2. “1字节UTF-8序列的无效字节1”错误
- 3. 无效字节1个字节的UTF-8序列错误
- 4. PostgreSQL的:“无效的字节序列编码‘UTF8’:只对错误
- 5. 正在抛出normalize_yaml_input中的无效字节序列错误?
- 6. JAXB错误的说明:1字节UTF-8序列的字节1无效
- 7. 错误str.default(tweets_text):无效的多字节字符串53
- 8. Postgres列加密错误 - 用于编码“UTF8”的无效字节序列:0xa3
- 9. Ruby 1.9 -Ku,mem_cache_store和无效的多字节转义错误
- 10. MalformedByteSequenceException:2字节的UTF-8序列无效的字节2
- 11. htmlspecialchars():参数CodeIgniter中的多字节序列无效
- 12. htmlspecialchars():参数中的多字节序列无效
- 13. getResponseBodyAsStream返回 “1字节UTF-8序列的无效字节1”
- 14. 2字节UTF-8序列的无效字节2
- 15. 1字节UTF-8序列的无效字节1
- 16. 引起:com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException:1字节UTF-8序列的无效字节1
- 17. Rails 3中,Heroku的 - PGError:错误:编码 “UTF8” 无效的字节序列:
- 18. 的PostgreSQL 9.5错误:编码“UTF8”无效的字节序列:0xc3 0xee
- 19. 错误:在pgadmin中插入用于编码“UTF8”的无效字节序列
- 20. 在rails 2.3和ruby 1.9中无效的字节序列utf-8错误
- 21. 如何解决“::的ActionView ::模板错误(无效字节序列UTF-8):”
- 22. 意外的错误在处理请求:无效字节序列UTF-8#
- 23. Postgres插入错误 - 错误:编码“UTF8”的无效字节顺序:0x00
- 24. R:无效的多字节字符串
- 25. 导入的XMI文件的XML项目错误:无效字节1个字节的UTF-8序列
- 26. Grails - Jasper Plugin - 使用.jasper文件的1字节UTF-8序列错误的无效字节1
- 27. 捆绑安装错误“在US-ASCII无效字节序列(引发ArgumentError)”
- 28. PicketLink:'错误:无效字节序列编码“UTF8”:设置密码时为0x00'
- 29. 错误:无效的列名
- 30. “无效的多字节字符(US-ASCII)”错误ä,ü,ö,ß这是Ascii!
我知道这是一个老话题,但我碰到这个问题也来了,并认为这可能是值得注意的是,不建议使用ENT_IGNORE的,因为它可能带来安全隐患: http://unicode.org/reports/tr36/#Deletion_of_Noncharacters – Dean 2012-03-09 07:26:17
是的,ENT_IGNORE是我目前发现的唯一修复程序(/ hack)。 – Kzqai 2012-07-24 18:35:42