前言

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表情与表情描述就这样转换完了。

更多相关文章

  1. android输入字符限制
  2. (转摘)Android腾讯微博客户端开发四:微博发送篇(QQ表情,@搜索)
  3. Pattern.compile
  4. 基站定位获取位置坐标
  5. Android(安卓)之gson字符串转java bean
  6. Accessing Resources
  7. Android学习笔记(17)————AutoCompleteTextView与TextWatcher
  8. Android(安卓)java在窗口画图写字符串
  9. 在Activity中注册广播

随机推荐

  1. Android中的信使Messenger的源码解析
  2. Android(安卓)Arch LifeCycle用法详解与
  3. OnTouchListener与OnGestureListener的区
  4. android JSON解析数据 android解析天气预
  5. android 五大布局-线性布局(LinearLayout)
  6. Maven Android使用一
  7. Android(安卓)使用Pull方法解析XML文件的
  8. Android(安卓)Tutorial #4.2: Passing cu
  9. Android(安卓)Fragment getActivity返回n
  10. delphi xe5 android tts(Text To Speech)