场景:
后台导出会员列表数据,导出报错,报错原因是昵称中包含了表情字符
- 报错代码:
return iconv('gb2312//ignore', 'utf-8', iconv('utf-8', 'gb2312//ignore', $str));
ignore
忽略转换错误
gbk与gb2312编码格式相同,gbk范围比gb2312范围广
最终在迫不得已的情况使用try catch
捕捉报错异常,促使代码能往下执行。
// 这里使用try-catch 是为了避免转换表情字符出现报错。
try{
return iconv('GBK//ignore', 'utf-8', iconv('utf-8', 'GBK//ignore', $str));
}catch (\Exception $e){
return "";
}
- 可参考网上方法:
mb_convert_encoding($str,"GBK","UTF-8");
设置为utf-8编码,strlen中文长度3英文长度1,emoji表情长度4(有些手势长度只有3); mb_strlen中英文、表情长度1,由此可去除表情字符
function removeEmojiChar($str)
{
$mbLen = mb_strlen($str);
$strArr = [];
for ($i = 0; $i < $mbLen; $i++) {
$mbSubstr = mb_substr($str, $i, 1, 'utf-8');
if (strlen($mbSubstr) >= 4) {
continue;
}
$strArr[] = $mbSubstr;
}
return implode('', $strArr);
}
/**
* 过滤特殊字符
* $str
**/
function filter($str){
if($str){
$name = $str;
$name = preg_replace('/\xEE[\x80-\xBF][\x80-\xBF]|\xEF[\x81-\x83][\x80-\xBF]/', '', $name);
$name = preg_replace('/xE0[x80-x9F][x80-xBF]‘.‘|xED[xA0-xBF][x80-xBF]/S','?', $name);
$return = @json_decode(preg_replace("#(\\\ud[0-9a-f]{3})#ie","",json_encode($name)));
}else{
$return = '';
}
return $return;
}