如何处理用户输入的无效UTF-8字符?

如何处理用户输入的无效UTF-8字符?,第1张

如何处理用户输入的无效UTF-8字符

accept-charset="UTF-8"
属性仅是浏览器要遵循的准则,并不强迫他们以这种方式提交,笨拙的表单提交机器人就是一个很好的例子…

我最常做的就是忽略坏的字符,无论是通过

iconv()
还是有不太可靠
utf8_enpre()
/
utf8_depre()
功能,如果你使用
iconv
你也有音译坏字符的选项。

这是一个使用示例

iconv()

$str_ignore = iconv('UTF-8', 'UTF-8//IGNORE', $str);$str_translit = iconv('UTF-8', 'UTF-8//TRANSLIT', $str);

如果您想向您的用户显示错误消息,我可能会以全局方式而不是按接收到的每个值来执行此 *** 作,类似这样的 *** 作可能会很好:

function utf8_clean($str){    return iconv('UTF-8', 'UTF-8//IGNORE', $str);}$clean_GET = array_map('utf8_clean', $_GET);if (serialize($_GET) != serialize($clean_GET)){    $_GET = $clean_GET;    $error_msg = 'Your data is not valid UTF-8 and has been stripped.';}// $_GET is clean!

您可能还需要规范化新行并去除(不)可见的控制字符,如下所示:

function Clean($string, $control = true){    $string = iconv('UTF-8', 'UTF-8//IGNORE', $string);    if ($control === true)    { return preg_replace('~p{C}+~u', '', $string);    }    return preg_replace(array('~rn?~', '~[^P{C}tn]+~u'), array("n", ''), $string);}

从UTF-8转换为Unipre代码点的代码:

function Codepoint($char){    $result = null;    $prepoint = unpack('N', iconv('UTF-8', 'UCS-4BE', $char));    if (is_array($prepoint) && array_key_exists(1, $prepoint))    {        $result = sprintf('U+%04X', $prepoint[1]);    }    return $result;}echo Codepoint('à'); // U+00E0echo Codepoint('ひ'); // U+3072

可能 比任何其他替代产品都快,但是尚未对其进行广泛的测试。


例:

$string = 'hello world�';// U+FFFEhello worldU+FFFDecho preg_replace_callback('/[p{So}p{Cf}p{Co}p{Cs}p{Cn}]/u', 'Bad_Codepoint', $string);function Bad_Codepoint($string){    $result = array();    foreach ((array) $string as $char)    {        $prepoint = unpack('N', iconv('UTF-8', 'UCS-4BE', $char));        if (is_array($prepoint) && array_key_exists(1, $prepoint))        { $result[] = sprintf('U+%04X', $prepoint[1]);        }    }    return implode('', $result);}

这是您要找的东西吗?



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5621503.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存