前言
Emoji表情几乎都是有表情描述的,如愤怒的表情会有[愤怒],这样的描述,这里就是举了个列子,至于是什么样的表现形势,这是可以自己定义的。那么这样,一个表情带一个表情描述的好处就是,当我们发送信息时,数据存入数据库后不会直接存储Emoji表情图片,而是直接存储表情描述这个字符串。
但是android 系统自带的Emoji表情描述是什么呢?似乎不知道,网上查了很多资料,说emoji有个自己的规则什么的。呃。。。表示看了半天没看懂。。。,于是乎就研究,系统自带的emoji如果打印成字符串是个什么鬼呢?
正文
于是乎我们进行了打印,打印之后效果图如下:
public class EmojiActivity extends Activity {
private TextView tv;
private EditText et;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_emoji);
initView();
viewOper();
}
private void initView() {
tv = findView(R.id.tv);
et = findView(R.id.et);
}
private void viewOper() {
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println(et.getText().toString());
}
});
}
private <T> T findView(int id) {
return (T) findViewById(id);
}
}
打印的结果:
一个不知道是什么的字符,这样存入数据库只会是一串问号,一朋友的是直接存不进去。查资料说要升级数据库,我勒个去,这样我肯定是不会去干的,因为不会后台呀。因此我就想到了把这个字符串拆分为字符对应的字符试试。
于是乎,就写了这样一段代码。
/**
* 将系统表情转化为字符串
*
* @param s
* @return
*/
public static String getString(String s) {
int length = s.length();
String context = "";
//循环遍历字符串,将字符串拆分为一个一个字符
for (int i = 0; i < length; i++) {
char codePoint = s.charAt(i);
//判断字符是否是emoji表情的字符
if (isEmojiCharacter(codePoint)) {
//如果是将以大括号括起来
String emoji = "{" + Integer.toHexString(codePoint) + "}";
context = context + emoji;
continue;
}
context = context + codePoint;
}
return context;
}
/**
* 是否包含表情
*
* @param codePoint
* @return 如果不包含 返回false,包含 则返回true
*/
private static boolean isEmojiCharacter(char codePoint) {
return !((codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA)
|| (codePoint == 0xD)
|| ((codePoint >= 0x20) && (codePoint <= 0xD7FF))
|| ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF)));
}
说下这段代码的流程吧,显示设置进去一个字符串,然后遍历循环判断每个字符是否为emoji表情。emoji表情的字符比普通字符大一些。别看上图输出的是一个‘口’字,但是他占用了两个字符。因此判断完后转化为数字并以转化为16进制的字符串。并以大括号来分隔开来。
那么转化后的样子就是这样的。
可以看出没转换后的‘口’字符是两个字符。这样我们就转化成功了,可以直接存入数据库了。那么我们如果要从数据库读取出来然后进行显示emoji表情呢。这个就简单了,直接进行正则匹配后截取中间的16进制转化为字符然后拼接为字符串就是了。
代码如下:
/**
* 将表情描述转换成表情
*
* @param str
* @return
*/
public static String getEmoji(Context context, String str) {
String string = str;
String rep = "\\{(.*?)\\}";
Pattern p = Pattern.compile(rep);
Matcher m = p.matcher(string);
while (m.find()) {
String s1 = m.group().toString();
String s2 = s1.substring(1, s1.length() - 1);
String s3;
try {
s3 = String.valueOf((char) Integer.parseInt(s2, 16));
string = string.replace(s1, s3);
} catch (Exception e) {
e.printStackTrace();
}
}
return string;
}
将emoji表情描述转化过来后的结果如下图:
然后将转化的结果设置展示组件就可以了,这样我们系统自带emoji表情与表情描述就这样转换完了。