尽管使用UTF-8,htmlentities()仍返回空值

时间:2017-07-04 12:44:57

标签: php utf-8 character-encoding

所以我试图使用htmlentities()来逃避PHP中的字符串 问题是,htmlentities返回一个空字符串。

我通过html <form>收到此字符串。包含表单标记的页面包含以下元标记:<meta charset="utf-8">

我的字符串以UTF-8编码,htmlentites()第三个参数是'UTF-8',我仍然得到一个空字符串。

这是我的代码:

$str = strtolower(trim($str));
var_dump($str, mb_detect_encoding($str), htmlentities($str), htmlentities($str, ENT_COMPAT, 'UTF-8'), htmlentities($str, ENT_COMPAT, 'ISO-8859-1'));

以下是var_dump显示的内容:

// Original string is é-è
// Expected output is &eacute;-&egrave;
string '�-�' (length=5) // Original string but why is the length 5 ?
string 'UTF-8' (length=5)
string '' (length=0)
string '' (length=0)
string '&atilde;&copy;-&atilde;&uml;' (length=28) // WTF ??

任何人都知道它来自哪里?

1 个答案:

答案 0 :(得分:0)

好的我发现了什么问题。 strtolower导致问题 请使用mb_strtolower

var_dump($str, mb_detect_encoding($str), htmlentities($str), htmlentities($str, ENT_COMPAT, 'UTF-8'), htmlentities($str, ENT_COMPAT, 'ISO-8859-1'));
$str = trim($str);
var_dump($str, mb_detect_encoding($str), htmlentities($str), htmlentities($str, ENT_COMPAT, 'UTF-8'), htmlentities($str, ENT_COMPAT, 'ISO-8859-1'));
$str = strtolower($str);
var_dump($str, mb_detect_encoding($str), htmlentities($str), htmlentities($str, ENT_COMPAT, 'UTF-8'), htmlentities($str, ENT_COMPAT, 'ISO-8859-1'));

这是输出:

// raw string é-è
string 'é-è' (length=5)
string 'UTF-8' (length=5)
string '&eacute;-&egrave;' (length=17)
string '&eacute;-&egrave;' (length=17)
string '&Atilde;&copy;-&Atilde;&uml;' (length=28)
// trim('é-è')
string 'é-è' (length=5)
string 'UTF-8' (length=5)
string '&eacute;-&egrave;' (length=17)
string '&eacute;-&egrave;' (length=17)
string '&Atilde;&copy;-&Atilde;&uml;' (length=28)
// strtolower('é-è')
string '�-�' (length=5)
string 'UTF-8' (length=5)
string '' (length=0)
string '' (length=0)
string '&atilde;&copy;-&atilde;&uml;' (length=28)

不知何故,strtolower()似乎仅适用于'ISO-8859-1',正如您在var_dumps中看到的那样,它将&Atilde;转换为&atilde;