input保存emoji发送java

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了input保存emoji发送java相关的知识,希望对你有一定的参考价值。

Copyright © 1999-2020, CSDN.NET, All Rights Reserved

打开APP

制造bug的键盘钢琴师
关注
Java中解决app传的emoji表情的多种方式 原创
2019-01-26 17:58:13
2点赞

制造bug的键盘钢琴师

码龄5年

关注
今天项目遇到的一个问题,APP订单评论提交emoji表情的话会报错,由于需要实现emoji表情评论的功能,根据自己实现的方式以及查询的实现方式,现总结为一下几种

mysql的utf8编码的一个字符最多3个字节,但是一个emoji表情为4个字节,所以utf8不支持存储emoji表情。

实现方式一
对APP传入后端的数据包括字符串和emoji表情,把emoji表情和String都进行Base64转换,存储在数据库中,取的时候再转换回来即可解决上述问题,这是最快也是最简单的解决方法。

1、最适合应用场景:

h5或者android开发中通常会遇到一种场景,当用手机输入法输入Emoji表情符的时候,由于数据库不支持,保存时这些表情符号就会被过滤掉以至于无法显示,android和h5开发中可以使用Base64算法解决这个问题。

2、使用工具:

使用Apache commons codec 类Base64

3、引入jar包:

加入jar包依赖(如果是maven项目就直接在pom文件中加入下边内容,若不是就加入对应jar包)

<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.6</version>
</dependency>

4、加密解密实现:

import org.apache.commons.codec.binary.Base64;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.io.UnsupportedEncodingException;

/**

* 将String类型的字符串进行base64编码与解码,使用utf-8

*/

public
class Base64Util

private
static
final Logger logger = LoggerFactory.getLogger(Base64Util.class);

/**

* 对给定的字符串进行base64加密

*/

public static String encodeData(String inputData)

try

if (
null == inputData)

return
null;



return
new String(Base64.encodeBase64(inputData.getBytes(
"utf-8")),
"utf-8");


catch (UnsupportedEncodingException e)

logger.error(inputData, e);



return
null;



/**

* 对给定的字符串进行base64解密

*/

public static String decodeData(String inputData)

try

if (
null == inputData)

return
null;



return
new String(Base64.decodeBase64(inputData.getBytes(
"utf-8")),
"utf-8");


catch (UnsupportedEncodingException e)

logger.error(inputData, e);



return
null;





1
1

实现方式二
mysql 字符集utf8的超集utf8mb4一个字符最多能有4字节,所以能支持emoji表情的存储。只要修改mysql数据库的编码格式变为utf8mb4即可
具体方法可参考连接
这种方式后台不用再做额外的操作,直接正常存储即可,但是修改数据库会比较麻烦

实现方式三
通过emoji-Java解决数据库不能存储4字节表情符号
参考技术A 今天项目遇到的一个问题,APP订单评论提交emoji表情的话会报错,由于需要实现emoji表情评论的功能,根据自己实现的方式以及查询的实现方式,现总结为一下几种

mysql的utf8编码的一个字符最多3个字节,但是一个emoji表情为4个字节,所以utf8不支持存储emoji表情。

实现方式一
对APP传入后端的数据包括字符串和emoji表情,把emoji表情和String都进行Base64转换,存储在数据库中,取的时候再转换回来即可解决上述问题,这是最快也是最简单的解决方法。

1、最适合应用场景:

h5或者android开发中通常会遇到一种场景,当用手机输入法输入Emoji表情符的时候,由于数据库不支持,保存时这些表情符号就会被过滤掉以至于无法显示,android和h5开发中可以使用Base64算法解决这个问题。

2、使用工具:

使用Apache commons codec 类Base64

3、引入jar包:

加入jar包依赖(如果是maven项目就直接在pom文件中加入下边内容,若不是就加入对应jar包)

<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.6</version>
</dependency>

4、加密解密实现:

import org.apache.commons.codec.binary.Base64;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.io.UnsupportedEncodingException;

/**

* 将String类型的字符串进行base64编码与解码,使用utf-8

*/

public
class Base64Util

private
static
final Logger logger = LoggerFactory.getLogger(Base64Util.class);

/**

* 对给定的字符串进行base64加密

*/

public static String encodeData(String inputData)

try

if (
null == inputData)

return
null;



return
new String(Base64.encodeBase64(inputData.getBytes(
"utf-8")),
"utf-8");


catch (UnsupportedEncodingException e)

logger.error(inputData, e);



return
null;



/**

* 对给定的字符串进行base64解密

*/

public static String decodeData(String inputData)

try

if (
null == inputData)

return
null;



return
new String(Base64.decodeBase64(inputData.getBytes(
"utf-8")),
"utf-8");


catch (UnsupportedEncodingException e)

logger.error(inputData, e);



return
null;





1
1

实现方式二
mysql 字符集utf8的超集utf8mb4一个字符最多能有4字节,所以能支持emoji表情的存储。只要修改mysql数据库的编码格式变为utf8mb4即可
具体方法可参考连接
这种方式后台不用再做额外的操作,直接正常存储即可,但是修改数据库会比较麻烦

实现方式三
通过emoji-Java解决数据库不能存储4字节表情符号
参考技术B 关于input保存emoji发送java相关资料如下
因为mysql的utf8编码的一个字符最多3个字节,但是一个emoji表情为4个字节,所以utf8不支持存储emoji表情。但是utf8的超集utf8mb4一个字符最多能有4字节,所以能支持emoji表情的存储。

3.解决方法之一

把你的数据库编码集设置为utf8mb4,无论是数据库还是表,还是字段。虽然会增加存储,但是这个可以忽略不计。

4.解决方法之二

有句话说得好,问题来了要么解决要么折中解决。如果有些原因你不能修改数据库编码之类的,你可以用java的一些插件,如emoji-java这种emoji表情插件对表情进行特殊处理,然后保存或者去掉表情,这也是一种解决方法哦。

mysql 微信用户昵称emoji 完整保存

微信用户昵称现在丰富多样,一些个性的名称中经常包含有特殊字符,以及emoji表情。起先,我总以为mysql只能保存纯文本数据。但其实mysql(5.7版本)已非常强大,完整保存微信用户昵称(emoji表情)已不在话下。

起先,我的项目是无法保存这些含有emoji表情的昵称。为了鲜明的对比前后我做出的调整,先来看看之前的状况。

1、mysql表字段定义

`third_name` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '用户第三方账号昵称',

字段类型为utf8

2、mysql数据库连接字符串

<!-- Connection Info -->
<property name="url" value="${url}?useUnicode=true&amp;characterEncoding=utf8&amp;" />

jdbc连接使用的编码格式也为utf8

3、微信昵称

这里写图片描述

这昵称中有emoji表情的小眼睛在瞅着我。

4、保存出错

Caused by: java.sql.SQLException: Incorrect string value: '\\xF0\\x9F\\x91\\x80\\xE5\\xBC...' for column 'third_name' at row 1
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)

接下来,我们看一下可以保存后的调整。

① mysql表字段定义为utf8mb4

`third_name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '用户第三方账号昵称',

注意改成了**“utf8mb4”**,不再是utf8,主要是支持的字节数不同。

MySQL在5.5.3版本之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。其实,utf8mb4是utf8的超集,理论上原来使用utf8,然后将字符集修改为utf8mb4,也会不会对已有的utf8编码读取产生任何问题。当然,为了节省空间,一般情况下使用utf8也就够了。
想要了解的更多,请参照浅谈MySQL中utf8和utf8mb4的区别

② mysql数据库连接字符串去掉编码方式

<!-- Connection Info -->
<property name="url" value="${url}" />

③ 保存后效果

使用Navicat查看的效果如下:

这里写图片描述

网页上效果如下,小眼睛可以正常显示:

这里写图片描述


关注 沉默王二 公众号,期待与你心灵上的交流。

以上是关于input保存emoji发送java的主要内容,如果未能解决你的问题,请参考以下文章

Java - emoji4j 静态方法调用结束/消失/死亡而没有错误

iOS开发emoji表情的输入思路

Android Socket通讯 分离服务端和客户端发送表情消息

Android Socket通讯 分离服务端和客户端发送表情消息

Android Socket通讯 分离服务端和客户端发送表情消息

通过 Java 发送保存在 Chrome 上的 HAR 文件