iconv(): Detected an illegal character in input string

场景:

后台导出会员列表数据,导出报错,报错原因是昵称中包含了表情字符

  • 报错代码:
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; 
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。