从字符串中删除非UTF-8字符

135

我在从字符串中删除非UTF-8字符方面遇到了问题,这些字符无法正确显示。这些字符的表示形式如0x97 0x61 0x6C 0x6F(十六进制表示)。

最好的方法是什么?使用正则表达式还是其他什么?


1
这里列出的解决方案对我没有用,所以我在“字符验证”部分找到了我的答案:http://webcollab.sourceforge.net/unicode.html - bobef
与此相关(https://dev59.com/cnM_5IYBdhLWcg3w43pt#20766625),但不一定是重复的,更像是近亲 :) - Wayne Weibel
$string = mb_convert_encoding($string, 'UTF-8', 'UTF-8');(对于非UTF8字符,会保留“?”符号) - Avatar
24个回答

0
static $preg = <<<'END'
%(
[\x09\x0A\x0D\x20-\x7E]
| [\xC2-\xDF][\x80-\xBF]
| \xE0[\xA0-\xBF][\x80-\xBF]
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}
| \xED[\x80-\x9F][\x80-\xBF]
| \xF0[\x90-\xBF][\x80-\xBF]{2}
| [\xF1-\xF3][\x80-\xBF]{3}
| \xF4[\x80-\x8F][\x80-\xBF]{2}
)%xs
END;
if (preg_match_all($preg, $string, $match)) {
    $string = implode('', $match[0]);
} else {
    $string = '';
}

它在我们的服务上运行正常


3
你能否为这个回答添加一些上下文,解释它是如何回答问题的,而不仅仅是代码? - Arun Vinoth-Precog Tech - MVP

0
从字符串中删除非UTF-8字符:
使用ICONV:
$text = iconv("UTF-8", "UTF-8//IGNORE", $text);

使用MBSTRING:
mb_substitute_character("none");
$text = mb_convert_encoding($text, "UTF-8", "UTF-8");

使用PCRE:
$text = preg_replace("/([\x{00}-\x{7E}]|[\x{C2}-\x{DF}][\x{80}-\x{BF}]|\x{E0}[\x{A0}-\x{BF}][\x{80}-\x{BF}]|[\x{E1}-\x{EC}\x{EE}\{xEF}][\x{80}-\x{BF}]{2}|\x{ED}[\x{80}-\x{9F}][\x{80}-\x{BF}]|\x{F0}[\x{90}-\x{BF}][\x{80}-\x{BF}]{2}|[\x{F1}-\x{F3}][\x{80}-\x{BF}]{3}|\x{F4}[\x{80}-\x{8F}][\x{80}-\x{BF}]{2})|(.)/s", "$1", $text);

请注意:0x09、0x0A、0x0D等等都是有效的UTF-8编码点。如果您需要删除不可打印字符,这是另一个问题。

-1

也许不是最精确的解决方案,但只需一行代码即可完成工作:

echo str_replace("?","",(utf8_decode($str)));

utf8_decode 将把字符转换成问号;
str_replace 将去除问号。


3
如果 $str = 'Hello?',该怎么办? - Nick
1
这也将剥离掉99%的所有有效Unicode字符,即那些不能在ISO 8859-1中表示的字符,因为这就是utf8_decode转换的内容。 - IMSoP

-3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接