在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
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');