当 utf-8 编码的输入包含变音符号时,htmlspecialchars 返回空字符串

问题描述

我在验证字符串时遇到问题。

tldr: 期待 utf-8 输入并希望对其进行验证。 有些字符串编码无法检测,编码设置为UTF-8,我得到的结果没问题。 某些字符串编码被检测为 UTF-8(因此无需设置编码)但结果被搞砸了。

仅供参考:我希望将存储在数据库中的 UTF-8 输入,所以我想验证给定的输入。 Input 可以包含德语元音变音,如 äÄ üÜ öÖ,此时我的代码显示出非常奇怪的行为。

以下代码显示了我为检查输入而构建的函数。我添加了一些转储来看看会发生什么......

function validate_input($pdata){

$data = $pdata;

var_dump(mb_detect_encoding($data)); //(1)

// detects encoding and changes to UTF-8 if the given is not utf-8 encoded
if(mb_detect_encoding($data) != "UTF-8"){
     $data = utf8_encode($data);
}

var_dump(mb_detect_encoding($data)); //(2)
var_dump($data); //(3)

//Converts specialchars to HTML-entities. If output is an empty string throw exception
if(($data = htmlspecialchars($data,ENT_QUOTES,"UTF-8")) == ""){
    throw new validationException("Invalid Charsequence causes empty String! Original data : {$pdata}");
}

var_dump($data); //(4)

$data = trim($data);
$data = stripcslashes($data);

return $data;
}

这里是我测试的案例和奇怪的结果

validate_input("String ö");

  1. 布尔(假)
  2. string(5) "UTF-8"
  3. string(9) "字符串 ö"
  4. string(9) "字符串 ö"

validate_input("String ä");

  1. string(5) "UTF-8"
  2. string(5) "UTF-8"
  3. string(8) "字符串�"
  4. string(0) ""(测试中禁用异常)

validate_input("String ü");

  1. 布尔(假)
  2. string(5) "UTF-8"
  3. string(9) "字符串ü"
  4. string(9) "字符串ü"

validate_input("String ê");

  1. string(5) "UTF-8"
  2. string(5) "UTF-8"
  3. string(8) "字符串�"
  4. string(0) ""(测试中禁用异常)

validate_input("String ß");

  1. string(5) "UTF-8"
  2. string(5) "UTF-8"
  3. string(8) "字符串�"
  4. string(0) ""(测试中禁用异常)

也许有人可以告诉我我错过了什么! 感谢帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)