过滤iphone表情

iphone表情,又称emoji表情,是苹果一个方便了用户却坑了开发人员的输入法的特殊字符。

因为emoji表情有时候不支持gb编码的数据库,在后台死活过滤都过滤不掉,但偏偏在入库时被过滤的,但是记录已经生成了。

所以造成一个问题是,如果用户单一输入一个表情并提交,数据库有记录却没有内容,所以很坑爹。

找了很久终于又解决方案,菜鸟的心得,分享下。

 

网上得知汉字的unicode编码范围是0x4e00~0x9fa5,但程序执行的utf-16编码后,输出地格式确实%格式的。一直搞不懂这个问什么,后来才知道,0x4e00对应的是%4e%00。

而当对一个汉字进行utf-16编码是,出现的是%FE%FF%57%28,对emoji表情的编码是%FE%FF%D8%3D%DE%04,除了长度确实很难找出与汉字的区别。

其实%FE%FF是一个标志,一个big endian编码的正序标志,表示之后的%57%28即为0x5728的意思。

所以emoji的编码就得出是%D8%3D%DE%04,其实这是由2个utf-16组成的utf-32编码,分为D83D与DE04。

0xD800~0xDfff 范围用于扩展,两个0xd800以上的值一同扩展出一个特殊的UTF-32范围内的值,也就是emoji的编码。

知道与汉字的区别就很好过滤了,直接replace掉就行了。

 

注意,emoji表情与汉字的utf-8是没什么区别的,可能我比较笨找不到,但之前确实是卡死在utf-8这个编码上了,因为web默认返回的就是utf-8,所以很难想到要用utf-16.

 

 

String finalStr=contents;
System.out.println("=======finalStr============"+finalStr+" 长度为====="+finalStr.length());
contents=URLEncoder.encode(contents, "utf-16");

//过滤掉各种特殊符号,数字,字母
finalStr = finalStr.replaceAll("[\\pP|~|$|^|<|>|\\||\\+|=]*", "");
finalStr = finalStr.replaceAll("[A-Za-z0-9\\d]" , "");
System.out.println("=======finalStr============"+finalStr+" 长度为====="+finalStr.length());

finalStr=URLEncoder.encode(finalStr, "utf-16");
// contents=URLEncoder.encode(contents, "utf-16");
finalStr=finalStr.replace("%fe%ff", "");
finalStr=finalStr.replace("%FE%FF", "");

System.out.println("==========finalStr============"+finalStr+" 长度为====="+finalStr.length());
int splitLen=6;
int pos=0;
int len=(finalStr.length()/splitLen);
System.out.println("==========len============"+len);
String[] splitStr=new String[len];

for(int i=0;i<len;i++){
System.out.println("==========pos============"+pos);
splitStr[i]=finalStr.substring(pos, pos+splitLen);
pos+=splitLen;

System.out.println("splitStr["+i+"]============"+splitStr[i]);

if(splitStr[i].substring(1, 2).equals("d") || splitStr[i].substring(1, 2).equals("D")){
contents=contents.replace(splitStr[i], "");
System.out.println("==========该字符要被和谐啦=========");
// System.out.println("splitStr["+i+"]=="+splitStr[i]);
}
}
System.out.println("==========最终的utf-16==="+contents);
contents=URLDecoder.decode(contents, "utf-16");
System.out.println("==========最终的文字==="+contents+" 长度为"+contents.length());

posted @ 2012-06-28 16:52  梦神十夜  阅读(855)  评论(0编辑  收藏  举报