表情字符过滤
mysql低版本中,utf8编码有两种,utf-8、utf8-mb4。其中后者的意思是: mb4就是most bytes 4的意思,用来兼容四字节的unicode 。
然后搜索一下:php 四字节的unicode,找到一篇博文:过滤四字节的emoji字符。
emoji
相应的php代码如下:
// 过滤掉emoji表情
function filterEmoji($str){
$str = preg_replace_callback('/./u',function (array $match) {
return strlen($match[0]) >= 4 ? '' : $match[0];
},$str);
return $str;
}
用手机找一个箱子的表情包:对应的unicode为:”\ud83d\udce6”。
js版本代码:
表情包.split('')
_.toArray(表情包)
var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
_.toArray = function(obj) {
return obj.match(reStrSymbol);
};
除此之外,还有无效码点「EF BF BD」:
在众多的utf-8码点值中,除了ascii,你还应该记住「EF BF BD」,因为它是很多编程语言以及库中的备胎,即无效的码点值在编码的时候会默认用这个码点值进行替换,即utf-8中的超级「备胎」(REPLACEMENT CHARACTER)。
备注
上面使用了正则匹配,对于150M的大文件,非常耗时,正则匹配速度很慢。而本身导入一个150M的csv文件入数据库,才23秒。而替换,要23秒。所以,上述方式检测编码,效率低。
utf-8 神秘符号 efbf bd ef bfbd
很多时候我们在打开utf-8的时候会有 � 等很多像问号的编码出现这时候我们打开这个文件的二进制就会发现 问号对应的十六进制编码就是efbf bdef bfbd。这个编码到底是什么呢?为什么会有这种编码呢。这就要从各种编码格式的转换说起。而且大部分出现这种问题的就是用gbk编码的文件用utf-8编码格式打开。当编码格式中出现utf-8无法解析的字节,那么这个字节就会被替换成 efbf bdef bfbd 这时我们会发现文件大小也发生了改变,因为未知字节全部变成三个未知字节。 而这时候再将其转换为gbk锟 (0xEFBF),斤(0xBDEF),拷(0xBFBD) 这就是 锟斤拷 那么我是在什么时候发现这个问题: python 的 print 我们一般都会把python代码设置成全局utf-8编码。这时候如果你收到的是一个gbk的编码,但是直接打出来。就会发现出现很多问号。这个时候直接复制粘贴再看二进制就不是真正接受的数据。因为print自动将收到的数据进行了utf-8解码。这样无法解析的编码就变成efbf bdef bfbd。所以在遇到乱码的时候就需要在数据的原始接受处,及第一次转码发生之前将数据用二进制写入文件留存
总结
本意是删除utf8中无效的乱码,尝试了编程语言实现,都很难。无意发现iconv就能实现,具体请参照iconv篇。