【问题标题】:htmlentities, htmlspecialchars, and "invalid multibyte sequence"htmlentities、htmlspecialchars 和“无效的多字节序列”
【发布时间】:2012-06-28 08:50:26
【问题描述】:

This question 告诉我

htmlentities 在所有方面都与 htmlspecialchars() 相同,除了 htmlentities(),所有具有 HTML 字符实体等价物的字符都被翻译成这些实体。

听起来 htmlentities 是我想要的。

然后this question 告诉我我需要“UTF-8”参数来消除这个错误:

Invalid multibyte sequence in argument

所以,这是我的编码包装函数(用于规范不同 PHP 版本的行为)

function html_entities ($s)
{
    return htmlentities ($s, ENT_COMPAT /* ENT_HTML401 */, "UTF-8");
}

我仍然收到“参数中的多字节序列”错误。

这是一个触发错误的示例字符串,它是十六进制编码:

Jigue à Baptiste

4a 69 67 75 65 20 e0 20 - 42 61 70 74 69 73 74 65

我注意到 à 编码为 0xe0,但编码为 单字节,高于 0x80。

我做错了什么?

【问题讨论】:

  • 我喜欢那些 “我做错了什么?” 问题,因为答案很简单:Something!
  • 你也没有做错什么。您将一个字符串传递给一个拒绝它处理它的函数,然后您会收到一条错误消息。这没有错,但正确,因为您在那里传递的字符串不正确。如果您实际上会得到未定义但预期的结果,那将是非常错误的。那么你做错了什么? “你有错误的期望,仅此而已。” 那么你期望该函数做什么以及为什么?

标签: php html character-encoding


【解决方案1】:

您的字符串以 ISO-8859-1 编码,而不是 UTF-8。简单明了。

function html_entities ($s)
{
    return htmlentities ($s, ENT_COMPAT /* ENT_HTML401 */, "ISO-8859-1");
                                                           ^^^^^^^^^^^^
}

【讨论】:

    【解决方案2】:

    如果à 编码为0xE0,那么您没有以UTF-8 编码保存文件。 0xE0 是无效的 UTF-8。应该是0xC3 0xA0

    以 UTF-8 编码保存您的文件。另见UTF-8 all the way through

    如果你在 utf-8 中正确保存,十六进制应该如下所示:

    4A 69 67 75 65 20 C3 A0 20 42 61 70 64 69 73 74 65
    J  i  g  u  e     à        B  a  p  t  i  s  t  e
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2014-05-31
      • 2011-10-21
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多