Android之初识Emoji

简介: 在开发中突然需要传Emoji,然而直接传的话会报错,而之前开发时又没接触够Emoji,所以打算好好研究一下。1.Emoji的形式我想先打印出来看看Emoji是怎么样的,我就设断,看看输入Emoji之后的字符串是怎样的,结果发生了十分有意思的事情。

在开发中突然需要传Emoji,然而直接传的话会报错,而之前开发时又没接触够Emoji,所以打算好好研究一下。

1.Emoji的形式

我想先打印出来看看Emoji是怎么样的,我就设断,看看输入Emoji之后的字符串是怎样的,结果发生了十分有意思的事情。
在调试监听的时候显示的是豆腐块


img_71da56c947e09a4958d5768604a17f8a.png

但是编译器里面又能显示图


img_fc11e7de745c5e2a3724b39faf797d0a.png

再试试在Log中打印,直接就不显示

img_1012da77c5c34df1a35468d9714028bd.png

做到这里,已经不禁让我怀疑人生,我发现我对String一无所知,瞬间真的有一种不知道要怎么弄的感觉。
如果哪位大神知道,请告诉我为什么String显示Emoji时会这样,谢谢。

虽然我不知道Emoji在String中到底是怎么样的,但是我可以用charAt()方法去查看它的地址,发现charAt()后打印出这个(我用了另一个Emoji)


img_3d62e1d51099eae7962b99e7c3f09ef9.png

实在看不出,再试试charArray


img_131d47de428fa1fc54741204d7163cf6.png

CN是中国图标的emoji
最后得到的结果是


img_82cb3f7cd5187844d011ae9eae9d3336.png

看得出分割时一般会把一个表情分割成2个char,国旗分割成4个,还有一个的,也看不出什么。

这什么玩意,还是不知道,上网查了下,这个叫Unicode 编码,这就很有意思了,那我就去看看编码的一些基础的知识。

2.编码

我就算没认真学过,都知道有个编码叫utf-8,那它和Unicode 编码有什么关系呢。

1个字节为8位,就是说1个字节可以用8位二进制来表示。而8位二进制一共有256种情况,也就是2的8次方。
所以刚开始就出现了ASCII码,它用每个情况表示一个符号,ASCII 码一共定义了 128 个字符。

但是想想,世界上这么多种符号,仅仅英文的话ASCII 码是能解决,但是汉字都不止256种了,所以产生了Unicode 编码,它就相当是ASCII 的一个扩展,但是,有会出现了一些问题,所以出现了UTF-8编码(我这只是简单的说)就当是规范了Unicode 编码。

所以Emoji得到的是Unicode编码,那么我就猜测一下为什么在AS中有时出现乱码,有时出现图案,因为在debug中在编辑器里面的是展示Unicode码的,所以能正常显示图片,而Logcat中的编码方式是utf-8,所以显示乱码。

不管怎么样,关键是这个Edittext.toString()得到的String是不是有Emoji的啊
既然打印和打断点不行,那我就只能画点时间搞个Demo了。
我做两个Edittext和一个Button,点击按钮时从第一个Edit获取String然后显示到第二个Edit

img_d2fa78e220a8acf5be0207d839ef1208.gif

从结果可以看出,String里面是有包含Emoji的只是不能正常打印出来而已。

3.上传到服务器

既然能保证String含有Emoji,那么下一步就是怎么上传到服务器,直接把这个String上传到服务器是会报错的。

(1)转成Base64
先把字符串转成Base64再上传,这是我在网上看到的一篇文章,先测试下转码后再解码能不能得到之前的形式。

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String str = edtUp.getText().toString();
                // 转码
                String str_count=  Base64.encodeToString(str.getBytes(),Base64.DEFAULT);
                // 解码
                String str2 = new String(Base64.decode(str_count.getBytes(), Base64.DEFAULT));

                edtDown.setText(str2);
            }
        });
img_1a2e6eaf8acd8be8f8705547c9e757ea.gif

可以看出可以使用Base64转码和解码是能成功得到Emoji的。转之后就是一个字符串,数据是能保存的,那接下来我就试试能不能把Emoji上传到数据库然后在返回正常显示。

测试中......测试内容保密......

最后得到结果并展示到textview


img_9894351aa7fcc0083e930a2e3c14fcdb.png

可以看出这样的做成是可以的,就不用再写什么先转换再拼接了。

4.屏蔽

直接上传emoji会出错,据说是因为


img_ef8291c46192585323893bcf5de32d5e.png

那这样的话,解决这个的问题其实还是数据库去改进,但是......你觉得你说一句“这个是后台的问题,你们来改”,后台人员就会改吗?他只会说“你们前端先想办法解决一下。”没错,受欺负的永远是前端,那怎么办,那我们只好想办法屏蔽咯。

(1)网上有很多判断的方法,但是我真的不敢用,有些评论说某些不完整,搞得我都不知道哪些是能用的,哪些是判断不完整的。
但是我又找不到其它解决的办法,总觉得屏蔽真麻烦,最直接的办法还是后台给改了,但是人家肯定不愿意弄,那我就贴上代码(真的很担心这个判断会不会又漏)

 /**
     *  屏蔽emoji
     */
    public static String deleteEmoji(String str){
        StringBuffer sb = new StringBuffer();
        char[] charArray = str.toCharArray();
        for (int i = 0; i < charArray.length; i++) {
            if (!isEmojiCharacter(charArray[i])) {
                sb.append(charArray[i]);
            }
        }
        return sb.toString();
    }

/**
     *  todo 这是网上找的判断区间,不知道完不完整,暂时先用
     * @param codePoint
     * @return
     */
    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)));
    }

这样操作就能得到屏蔽表情的字符串。

5.总结

关于emoji我是第一次尝试,这回主要做的任务是怎么将emoji传到后台并正常获取显示。表面上我是实现这个功能了,为什么说是表面上呢,因为我传的是Base64,如果真要这么做的话,必须和所有端都统一,不然你传Base64,其它端不解码展示Base64那就很麻烦。

我想真正寻求的最优解是我这传的是字符串,别的机子要是能正常显示就显示,不能正常显示就隐藏,但是发现目前我还真不知道要怎么弄,直接传的String后台是无法接收的,好像是因为数据库是3位而emoji大部分都是4位。

还有一点就是自己写一个Emoji页面来展示这个没做,现在用的Emoji是输入法提供的,但是有些APP会有自己弄的Emoji页面,这个之后再说吧,总之这次最大的收获就是基本认识了Emoji,有种一层迷雾散开的感觉,虽然并没解决最根本的需求问题,但也不亏。


补充

1.开源框架

之后我又发现一个开源的emoji操作的框架
https://github.com/vdurmont/emoji-java
这个框架的API还是挺好了解的,就是那个判断字符串中是否包含emoji的判断没用,但是可以用获取emoji数据取长度来判断

 List<String> emojis =  EmojiParser.extractEmojis(str);
if (emojis.size() > 0) {
      ......
}
2.使用屏蔽的场景

上面我已经讲了在数据库不支持的情况怎么上传emoji,现在我打算补充下屏蔽emoji的使用场景。
(1)比如输入名称/标题等等这些场景如果输入emoji的话,就好就是提示用户无法输入特殊符号(仿美团的做法)
(2)比如评论,回复这些长的内容输入emoji而要屏蔽的话,可以在上传时候删除掉其中的emoji,用我发的框架的做法就是

 EmojiParser.removeAllEmojis(str)
目录
相关文章
|
Android开发
android String.xlm中使用emoji表情的方法
android 要在TextView中加入emoji的方法有多种,比较常见便捷的是在String.xml加上emoji的UniCode编码
253 0
android String.xlm中使用emoji表情的方法
|
存储 关系型数据库 MySQL
Emoji表情符号兼容方案(适用ios,android,wp等平台)
http://blog.csdn.net/qdkfriend/article/details/7576524   Emoji表情符号兼容方案 一 什么是Emoji          emoji就是表情符号;词义来自日语(えもじ,e-moji,moji在日语中的含义是字符)  表情符号现已普遍应用于手机短信和网络聊天软件。
3504 0
|
3天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
26天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0
|
1月前
|
XML 缓存 Android开发
Android开发,使用kotlin学习多媒体功能(详细)
Android开发,使用kotlin学习多媒体功能(详细)
102 0
|
1月前
|
设计模式 人工智能 开发工具
安卓应用开发:构建未来移动体验
【2月更文挑战第17天】 随着智能手机的普及和移动互联网技术的不断进步,安卓应用开发已成为一个热门领域。本文将深入探讨安卓平台的应用开发流程、关键技术以及未来发展趋势。通过分析安卓系统的架构、开发工具和框架,本文旨在为开发者提供全面的技术指导,帮助他们构建高效、创新的移动应用,以满足不断变化的市场需求。
18 1
|
17天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。
|
19天前
|
监控 算法 Android开发
安卓应用开发:打造高效启动流程
【4月更文挑战第5天】 在移动应用的世界中,用户的第一印象至关重要。特别是对于安卓应用而言,启动时间是用户体验的关键指标之一。本文将深入探讨如何优化安卓应用的启动流程,从而减少启动时间,提升用户满意度。我们将从分析应用启动流程的各个阶段入手,提出一系列实用的技术策略,包括代码层面的优化、资源加载的管理以及异步初始化等,帮助开发者构建快速响应的安卓应用。