替换非UTF8字符

时间:2011-09-21 15:09:33

标签: php encoding utf-8

在php中,我需要替换字符串中的所有非UTF8字符。但是,不是通过某些等效项(例如iconv函数与//TRANSLIT),而是通过某些选定的字符(例如"_""*")。

通常我希望用户能够看到找到无效字符的位置。

我没有找到任何这样做的功能,所以我打算使用:

  • iconv//IGNORE
  • 一起使用
  • 对两个字符串执行diff操作,并将所需字符插入非UTF8的字符串

你是否看到了更好的方法,是否有一些PHP中的功能可以组合起来有这种行为?

谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

这里有两个功能可以帮助您达到您想要的效果:

//reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ?
$some_string = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'.
 '|[\x00-\x7F][\x80-\xBF]+'.
 '|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'.
 '|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'.
 '|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S',
 '?', $some_string );

//reject overly long 3 byte sequences and UTF-16 surrogates and replace with ?
$some_string = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'.
 '|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $some_string );

请注意,您可以通过更改位于preg_replace('blablabla', **'?'**, $some_string)

的字符串来更改替换(当前为'?'以及其他任何内容)

原始文章:http://magp.ie/2011/01/06/remove-non-utf8-characters-from-string-with-php/