java如何处理emoji表情,并存入数据库

这个很简单呀 你把数据库或者对应表/字段的编码格式从utf8改成utf8mb4就可以存储emoji表情了,utf8对应的字节数不够所以会报错,mysql8默认的就是utf8mb4,可以了解下

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字节表情符号

unicode emoji是4个字节的,存不进MySQL里,找到一个转义的库http://code.iamcal.com/php/emoji/,但是转为Unicode之后,还是4个字节,一样存不进,应该说根本没转。转为其他格式的emoji又怕以后新增了表情不好做,你们在不改数据库编码的前提下,是怎么弄的?

方法1:base_encode64

这种方法是可以,但是旧数据没有经过encode *** 作,取数据的时候如果统一进行decode的话,旧数据会丢失的。

方法2:urlencode

这个似乎可以,对没有经过encode的数据进行decode也不会有影响,而且多次decode似乎也不会有影响。你们说这个方法有缺陷吗?

=======================

一个发现,微信获取用户基本信息的时候,笑哭那个表情print_r出的是\ud83d\ude02,而我存储的时候,报错说这个 \xF0\x9F\x98\x82 值不能存储,请问这是怎么回事,自动转码了,转成的这是什么?是微信转码过了吗?

=======================

方法3:最后采用了下面采纳的那个方法,因为我觉得它有下面几个优点:

1、那个方法只转换表情,不会转换中文,所以数据还是直接可读的

数据库中存储起来是这样的, 后面的\ud83d\udca5可以随意复制粘贴,而显示出来是这样的,

2、不会把表情转换为其它标准,只有一个简单的,固定的转换算法,也就是说不需要一个表情库来对照着转换,所以以后其它人要使用这个数据的时候,也很容易知道每个表情是对应的哪个。就算苹果大爷又增加了表情,也不需要做什么额外的修改。

3、可以无限decode输出的都是正确的内容。因为有的时候可能需要在一次请求中的两个地方做decode,其它decode多次会把正确的数据改成其它数据,这个不会。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10036525.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存