代码之家  ›  专栏  ›  技术社区  ›  GSto

HTMLEntities“无效的多字节序列”错误

php
  •  13
  • GSto  · 技术社区  · 15 年前

    当试图通过php的htmlentities函数运行一个字符串时,我遇到了一些情况,在这些情况下我会得到一个“无效的多字节序列”错误。是否有方法在调用函数之前清除字符串以防止发生此错误?

    7 回复  |  直到 12 年前
        1
  •  8
  •   Yi Jiang G-Man    13 年前

    对于php 5.3.0及以下版本,默认字符集为 htmlentities() 是ISO-859-1。( Manual )

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

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

    从php 5.4.0开始,默认字符集是utf-8。

        2
  •  9
  •   Ted    13 年前

    我遇到过一些场景,其中指定UTF-8不够,并且发现ent_ignore选项很有用。我不认为它是为HTMLEntities编写的,只为HTMLSpecialChars编写的,但它确实可以抑制错误。

        3
  •  9
  •   NikiC    12 年前

    从php 5.4开始,您应该使用下面的内容来正确地转义输出:

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

    ENT_SUBSTITUTE 将无效的代码单元序列替换为“1/2”(而不是返回空字符串)。

    ENT_DISALLOWED 将指定doctype中无效的代码点替换为“?

    ENT_HTML5 指定使用的doctype。根据您使用的内容,您可以选择 ENT_HTML401 , ENT_XHTML ENT_XML1 .

    使用这些选项,您可以确保结果在给定doctype中始终有效,而不管您得到的输入是多么令人讨厌。

    另外,不要忘记指定 $stringEncoding . 依靠违约是一个坏主意,因为它取决于 ini 设置和可能(和确实)在版本之间发生更改。

        4
  •  6
  •   Paul DelRe    12 年前

    通常,php ini设置显示错误可用于控制 无论错误是否输出到浏览器,ini设置日志\u错误 可独立用于控制是否将错误写入 如果自定义错误处理程序已设置为 设置_error_handler(),则始终对所有错误调用此函数,并且可以 然后读取显示错误和日志错误的值以及 错误报告()的值,并采取适当的措施, 正确的?

    错了!在这种情况下,只有当display_errors的值为false时,htmlspecialchars()和htmlentities()才会触发错误。如果 显示错误值为真,则根本不会触发任何错误! 这种看似荒谬的行为使我们无法察觉 这些错误在调试过程中显示为“错误”。

    I got the information from here

        5
  •  2
  •   Holger Thiebosch    12 年前

    是否在要检查的字符串中的某个位置使用SUBSTR。然后我建议使用mb_substr作为替代。 问题是SUBSTR不支持Unicode。所以,它只是截断多字节字符集中的字节。

        6
  •  -1
  •   Brendon McBain    12 年前

    HTML_实体($variable,ent_引号);对我来说总是很好的工作。

        7
  •  -2
  •   Kzqai    12 年前

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

    请参阅此处了解更多详细信息: http://www.php.net/manual/en/mbstring.overload.php