您的位置:首页 > 其它

Emoji表情过滤

2016-03-18 00:00 316 查看
摘要: 由于最新版的emoji使用的编码和之前老版本的编码增加了四字节的一些表情,导致一些新版表情过滤不掉并入库失败,于是针对于新版的unicode10中的表情编码进行分析并使用代码过滤

首先,看一下unicode10中的新版emoji表情包(链接),一共有1600+款表情,

经过分析,新增加的表情基本都是两个或者更多unicode码,于是将以上表情包中的html文件下载下来进行解析,并输出成java的map,代码基本格式如下

map.put("😀", "U+1F600");
map.put("😁", "U+1F601");
map.put("😂", "U+1F602");
map.put("😃", "U+1F603");
map.put("😄", "U+1F604");
map.put("😅", "U+1F605");
map.put("😆", "U+1F606");

经过对表情的unicode进行不同编码格式的分析,发现两个unicode以上的表情的16进制基本都是以/F0开头,决定拿这些开刀

/**
* 字符串转换成十六进制字符串
* @param String str 待转换的ASCII字符串
* @return String 每个Byte之间/分隔,如: [/61/6C/6B]
*/
public static String str2HexStr(String str)
{
char[] chars = "0123456789ABCDEF".toCharArray();
StringBuilder sb = new StringBuilder("");
byte[] bs = str.getBytes();
int bit;

for (int i = 0; i < bs.length; i++)
{
sb.append('/');
bit = (bs[i] & 0x0f0) >> 4;
sb.append(chars[bit]);
bit = bs[i] & 0x0f;
sb.append(chars[bit]);
}
return sb.toString().trim();
}

将其转化成字符串之后

while(resultStr.indexOf("/F0") != -1){
resultStr = resultStr.replace(resultStr.substring(resultStr.indexOf("/F0"), resultStr.indexOf("/F0") + 12), "/3F");
}
resultStr = resultStr.replace("/", "");
System.out.println(resultStr);

将/F0后面的四个16进制的转化成/3F,即“?”;

然后再讲替换之后的16进制字符串转化成正常的字符串

/**
* 十六进制转换字符串
* @param String str Byte字符串(Byte之间无分隔符 如:[616C6B])
* @return String 对应的字符串
*/
public static String hexStr2Str(String hexStr)
{
String str = "0123456789ABCDEF";
char[] hexs = hexStr.toCharArray();
byte[] bytes = new byte[hexStr.length() / 2];
int n;

for (int i = 0; i < bytes.length; i++)
{
n = str.indexOf(hexs[2 * i]) * 16;
n += str.indexOf(hexs[2 * i + 1]);
bytes[i] = (byte) (n & 0xff);
}
return new String(bytes);
}

运行结果如下图



code下载地址:http://download.csdn.net/detail/pan_shuyang/9465438
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Emoji 过滤 /F0