在PHP中消毒UTF-8

在PHP中消毒UTF-8,php,utf-8,sanitization,Php,Utf 8,Sanitization,函数json\u encode需要有效的UTF-8字符串。我有一个字符串可能采用不同的编码。我需要忽略或替换所有无效字符才能转换为JSON 它应该是非常简单和健壮的 错误在一个用于手动检查的模块中,因此mojibake没有问题 负责固定编码的代码位于不同的模块中。(虽然它坏了)我不想重复责任 无效字符串示例的十六进制表示:496e76616c6964206d61726b2096 我当前的解决方案: $raw_str = hex2bin('496e76616c6964206d61726b2096'

函数
json\u encode
需要有效的UTF-8字符串。我有一个字符串可能采用不同的编码。我需要忽略或替换所有无效字符才能转换为JSON

  • 它应该是非常简单和健壮的
  • 错误在一个用于手动检查的模块中,因此mojibake没有问题
  • 负责固定编码的代码位于不同的模块中。(虽然它坏了)我不想重复责任
  • 无效字符串示例的十六进制表示:
    496e76616c6964206d61726b2096

    我当前的解决方案:

    $raw_str = hex2bin('496e76616c6964206d61726b2096');
    $sane_str = @\iconv('UTF-8', 'UTF-8//IGNORE', $raw_str);
    
    我的代码有三个问题:

  • iconv
    看起来有点太重了
  • 许多程序员不喜欢
    @
  • iconv
    可能会忽略太多内容:整个字符串
  • 还有更好的主意吗


    也有类似的问题,但我不关心转换。

    您应该研究mb\u convert\u编码。它能够将文本从几乎任何编码转换为另一种编码。我不得不将它用于一个类似的项目:

    函数
    json\u编码
    。使用基于W3C推荐的正则表达式答案的函数检查编码:

    然后你可以使用它:

    $sane_str = encodeUtf8($raw_str);
    
    您可以使用来检测它是否不是UTF-8,然后使用将文本转换为UTF-8

    <?php
    /**
     * Convert json blob to UTF-8
     * @param $string String to be decoded
     * @return bool|string
     */
    function convert_json($string)
    {
        if (ctype_print($string)) { // binary
            return false;
        }
        $from = mb_detect_encoding($string, ['auto']);
        $to = 'UTF-8';
        if ($from !== $to) {
            $string = mb_convert_encoding($string, $to, $from);
        }
        return $string;
    }
    

    我认为这是最好的解决方案

    $raw_str = hex2bin('496e76616c6964206d61726b2096');
    $sane_str = mb_convert_encoding($raw_str, 'UTF-8', 'UTF-8');
    

    如果你不关心转换。。。那么你想做什么?我需要一个有效的UTF-8字符串用于json_编码。有效的mojibake就可以了。就这些。老实说,你的解决方案是我能看到的最干净的。如果不想使用
    @
    ,可能需要对字符串进行编码检查,这很麻烦。与其说是答案,不如说是注释!当你发表评论时使用评论,而不是我的否决票。顺便说一句,请不要使用回答来询问澄清问题。我很抱歉,仍在学习该系统。虽然我认为这就是他所寻找的功能。@raphael75那么你应该修改你的答案,以自信地支持它,而不是问一个问题(这只会留下不确定的空间)。您将获得+选票,而不是减少;-)Stack pro-tip@raphael75根据您的编辑,您的答案现在更有意义;-)
    $raw_str = hex2bin('496e76616c6964206d61726b2096');
    $sane_str = mb_convert_encoding($raw_str, 'UTF-8', 'UTF-8');