该
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);}
这是您要找的东西吗?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)