字符串中带有emoji表情处理

1:先删除字符然后解析当前字符再显示

edit.addTextChangedListener(new TextWatcher() {    @Override    public void beforeTextChanged(CharSequence s, int start, int count, int after) {    }

    @Override    public void onTextChanged(CharSequence s, int start, int before, int count) {    }

    @Override    public void afterTextChanged(Editable s) {        send.setEnabled(!s.toString().isEmpty());        int start = edit.getSelectionStart();        int end = edit.getSelectionEnd();        edit.removeTextChangedListener(this);        CharSequence cs = EmojiManager.parse(s.toString(), edit.getTextSize());        Toast.makeText(login.this,cs.toString(),Toast.LENGTH_SHORT).show();        edit.setText(cs, TextView.BufferType.SPANNABLE);        edit.setSelection(start, end);        edit.addTextChangedListener(this);    }});2:解析方法  判断每个字符的是否为表情然后做处理
public static CharSequence parse(String text, float textSize) {    if (text == null) {        return "";    }    //将字符串转换为数组    final char[] chars = text.toCharArray();    final SpannableStringBuilder ssb = new SpannableStringBuilder(text);

    int codePoint;    boolean isSurrogatePair;    for (int i = 0; i < chars.length; i++) {        if (Character.isHighSurrogate(chars[i])) {            continue;        } else if (Character.isLowSurrogate(chars[i])) {            if (i > 0 && Character.isSurrogatePair(chars[i - 1], chars[i])) {                codePoint = Character.toCodePoint(chars[i - 1], chars[i]);                isSurrogatePair = true;            } else {                continue;            }        } else {            codePoint = (int) chars[i];            isSurrogatePair = false;        }

        if (emojiCodeList.contains(codePoint)) {            Bitmap bitmap = BitmapFactory.decodeResource(gContext.getResources(), getResourceByCode(codePoint));            BitmapDrawable bmpDrawable = new BitmapDrawable(gContext.getResources(), bitmap);            bmpDrawable.setBounds(0, 0, (int) textSize, (int) textSize);            CenterImageSpan imageSpan = new CenterImageSpan(bmpDrawable);            ssb.setSpan(imageSpan, isSurrogatePair ? i - 1 : i, i + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);        }    }    return ssb;}

private static class CenterImageSpan extends ImageSpan {

    public CenterImageSpan(Drawable draw) {        super(draw);    }

    @Override    public void draw(Canvas canvas, CharSequence text, int start, int end, float x,                     int top, int y, int bottom, Paint paint) {        Drawable b = getDrawable();        Paint.FontMetricsInt fm = paint.getFontMetricsInt();        int transY = ((bottom - top) - getDrawable().getBounds().bottom) / 2 + top;        canvas.save();        canvas.translate(x, transY);        b.draw(canvas);        canvas.restore();    }}
时间: 2024-10-14 00:22:42

字符串中带有emoji表情处理的相关文章

去除字符串中的emoji字符

对于使用utf8编码的mysql数据库来说,如果字符串中存在emoji小图像,是不能存进数据库中的,查了一下,原因大概是因为utf8编码可以存1-3个字节的字符,但是emoji是4个字节:解决方法可以把mysql的编码换成utf8mb4,需要相应版本的mysql:另外一种方法是把字符串中所有的emoji给去除掉,然后在存进数据库,具体的方法是: public static String filterEmoji(String source,String slipStr) { if(isNotBla

轻松处理PHP开发中微信emoji表情mysql存储的问题

背景 做微信开发的时候发现,微信支持emoji表情做昵称,结果考虑不周 Mysql表设计时,都是用UTF8字符集的.把带有emoji的昵称字段往里面insert一下就没了,整个字段变成了空字符串.有的根本插入是失败,原来是因为Mysql的utf8字符集是3字节的,而emoji是4字节,这样整个昵称就无法存储了. 这要怎么办呢? 第一种方案: 如果你已经有很多数据了就不要修改字符集了因为会造成乱码情况你可以干掉他或者表情替换成*** $result['nickname'] = preg_repla

Java在mysql中存储emoji表情

mysql存储emoji表情要使用utf8mb4字符集,这是4字节存储,最低支持版本为5.5.3+,若不是,请升级到较新版本. 修改mysql配置文件 Window目录: mysql/my.ini Ubuntu16.04目录: /etc/mysql/conf.d/mysql.cnf  配置Client /etc/mysql/mysql.conf.d/mysql.cnf  配置Server 其他目录: 一般在etc/mysql/my.cnf 在mysql配置文件添加以下三部分内容: [client

ios中使用emoji表情

在iOS UILabel,UITextView,UIAlertView等控件中都可以使用 使用方法如下 NSString *s = [NSString stringWithFormat:@"This is a smiley \ue415 %C face",0xE05A]; NSLog(@"11----%@",s); label.text=s; 以下是对应的表情编码,但是新版sdk中编码有所改变,具体请参考苹果官方文档对照着看http://opensource.app

[转]PHP开发中涉及到emoji表情的三种处理方法

最近几个月做微信开发比较多,存储微信昵称必不可少,可这万恶的微信支持emoji表情做昵称,这就有点蛋疼了 一般Mysql表设计时,都是用UTF8字符集的.把带有emoji的昵称字段往里面insert一下就没了,整个字段变成了空字符串.这是怎么回事呢? 原来是因为Mysql的utf8字符集是3字节的,而emoji是4字节,这样整个昵称就无法存储了.这要怎么办呢?我来介绍几种方法 1.使用utf8mb4字符集 如果你的mysql版本>=5.5.3,你大可直接将utf8直接升级为utf8mb4字符集这

emoji 表情与MySQL编码问题

Emoji,这些能够表达情感的小卡通图像已经成为现代交流中不可或缺的一部分,以至于emoji这一单词已经在2015年被正式收入韦氏词典和牛津词典.说到emoji的诞生,这里还有一个很有趣的小故事:1999年前后,日本一个名叫栗田穰崇的年轻人,和许多直男一样, 给女友发的短信经常会被误解.比如,"知道了"被解读成"生气了"."不耐烦了",随后引发冷战. 于是少年栗田想:"如果能在文字里插入一些表情符号来表达感情,大家应该会需要吧!&quo

mysql存储emoji表情

微信获取的用户昵称nickname中带有emoji表情,转换成字符码后是这种形式“\xF0\x9F\x91\x8D\xE6\x94...”, 直接保存可能出现以下错误 Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x84' for column 'review' at row 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:

微信去除EMOJI表情

方法是: 方法是:return json_decode(preg_replace("#(\\\ue[0-9a-f]{3}|\\\ud83e|\\\udd14)#ie", "", json_encode($text))); 原理是: 进行微信公众号开发者接入的时候,与用户的对话互动中,涉及到的文本信息不仅仅是文字那么简单,其中可能还会包含着各种表情字符,例如「emoji表情」. 百科: Emoji 由于微信接口中对于emoji表情使用的是UTF-8的二进制字符串,并没

微信昵称emoji表情,特殊表情导致列表不显示,导出EXCEL报错等问题解决!

最近做的项目,上线后一切正常,过段时间管理员反馈用户导出EXCEL报错,前台获取用户列表不显示,查找问题找到是微信昵称.emoji表情导致报错, emoji表情介绍 由于微信接口中对于emoji表情使用的是UTF-8的二进制字符串,并没有解码,表现就是当收到微信端用户发来的emoji表情时,显示为一个方块型「」或是无法显示的字符,这时就需要对其进行转码. 每个emoji表情其实都有相应的unicode编码,在解析用户向公众号发送的文字中的emoji表情字符时,我们可以根据unicode码来匹配