android系统自带Emoji表情与表情描述互相转换
16lz
2021-01-26
前言
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 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表情与表情描述就这样转换完了。
更多相关文章
- android输入字符限制
- (转摘)Android腾讯微博客户端开发四:微博发送篇(QQ表情,@搜索)
- Pattern.compile
- 基站定位获取位置坐标
- Android(安卓)之gson字符串转java bean
- Accessing Resources
- Android学习笔记(17)————AutoCompleteTextView与TextWatcher
- Android(安卓)java在窗口画图写字符串
- 在Activity中注册广播
随机推荐
- Android中的信使Messenger的源码解析
- Android(安卓)Arch LifeCycle用法详解与
- OnTouchListener与OnGestureListener的区
- android JSON解析数据 android解析天气预
- android 五大布局-线性布局(LinearLayout)
- Maven Android使用一
- Android(安卓)使用Pull方法解析XML文件的
- Android(安卓)Tutorial #4.2: Passing cu
- Android(安卓)Fragment getActivity返回n
- delphi xe5 android tts(Text To Speech)