htmlentities,htmlspecialchars和“无效的多字节序列”

时间:2012-06-28 08:50:26

标签: php html character-encoding

This question告诉我

  

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

听起来像是我想要的人。

然后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。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

如果将à编码为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