Android关于匹配系统表情的方案
最近一直在研究表情的实现,自定义的表情实现网上很多demo这边就不做介绍了,主要介绍下android系统自带的表情,也是搜狗输入法的表情,如何获取,解析的一个方案,这边给出一个较为low的方案适用于小公司,大公司当然是跟微信靠齐写个匹配库,废话不多说:
首先我们可以写个edtitext然后获取输入的内容通过string类型打印发现他是乱码两个问号,但是再把这个乱码settext到textview上又发现他又是表情了。原因是系统内部有对应的Unicode对应相应的表情,可以把这些Unicode
转换为16进制字符串来进行展示,如0x1F602。我们通过Character.toChars(0x1F602)的方式得到char类型在通过new String的形式得到字符串把他settext发现就是个表情,那么问题来了,我们必然是要把这些表情提交到后台。总不能上传乱码。也就是说我们也要把获得的表情字符转换为十六进制的在进行提交或者展示,简单说一下我的做法:
public static int getIngeger(String s){
int a=0;
for(int i=0;i<s.length;i++){
char c=s.charat(i);
int i1 = c - 48;
a+=i1;
}
return a;
}
这里代码很简单,作用是把字符串转换为char类型之后通过char类型得到int类型,为啥char-48就是int这个是因为他们的ascill差48;得到int 类型之后,String s2 = Integer.toHexString(ingeger);我们可以通过这种方式得到16进制的字符串,也可以通过BigInteger bigInteger=new BigInteger(s2,16);的方式得到biginteger的方式的bigInteger.intValue()拿到16进制int类型,之后根据我们所说的Character.toChars()方法拿到char类型在new string,在set到textview上之后你发现!被骗了- -,根本就不是那个表情,为啥呢,因为算的数不对呗,怎么就对了呢,new String(Character.toChars(bigInteger.intValue()+16419));好就是这段代码。前面读懂了理解这段代码应该不难,只是在16进制的int类型加了个16419,为什么加他,不解释,快去试试吧= =。
附一段方法:
//是否是表情
private static booleanisEmojiCharacter(charcodePoint) {
return!((codePoint ==0x0) ||
(codePoint ==0x9) ||
(codePoint ==0xA) ||
(codePoint ==0xD) ||
((codePoint >=0x20) && (codePoint <=0xD7FF)) ||
((codePoint >=0xE000) && (codePoint <=0xFFFD)) ||
((codePoint >=0x10000) && (codePoint <=0x10FFFF)));
}
//把字符串格式化的代码
public staticStringuncler(String str){
inta=0;
intb=0;
StringBuffer stringBuffer =newStringBuffer();
for(inti=0;i
charc = str.charAt(i);
if(isEmojiCharacter(c)){
a+=c-48;
b+=1;
if(b<2){
continue;
}
}
if(a!=0){
String s2 = Integer.toHexString(a);
BigInteger bigInteger=newBigInteger(s2,16);
stringBuffer.append("&#"+Integer.toHexString(bigInteger.intValue()+16419));
b=0;
a=0;
}else{
stringBuffer.append(c);
}
}
returnstringBuffer.toString();
}
----------------byzzw