mysql存储emij表情_【MySQL】存储emoji表情报错(Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...')的解决方案...

Emoji表情字符现在在APP已经广泛支持了。但是MySQL的UTF8编码对Emoji字符的支持却不是那么好。所以我们经常会遇到这样的异常:

Java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E' for column 'nick' at row 1

1

原因是Mysql里UTF8编码最多只能支持3个字节,而Emoji表情字符使用的UTF8编码,很多都是4个字节,有些甚至是6个字节。

解决的方案有两种:

使用utf8mb4的mysql编码来容纳这些字符。

过滤掉这些特殊的表情字符。

方法1:使用utf8mb4的mysql编码来容纳这些字符

注意:要使用utf8mb4类型,首先要保证Mysql版本要不低于 MySQL 5.5.3。

第一步:在mysql的安装目录下找到my.ini,作如下修改

[client]

default-character-set = utf8mb4

[mysql]

default-character-set = utf8mb4

[mysqld]

character-set-client-handshake = FALSE

character-set-server = utf8mb4

collation-server = utf8mb4_unicode_ci

init_connect='SET NAMES utf8mb4'

修改后重启Mysql

第二步:将已经建好的表也转换成utf8mb4

alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin;

1

将TABLE_NAME替换成你的表名。然后就OK了。

网上流传的一个版本增加了一个步骤,就是以root身份登录Mysql,修改环境变量,将

character_set_client,character_set_connection,character_set_database,character_set_results,character_set_server

1

都修改成utf8mb4。不过我没有做这一步,也正常,所以可能是这一步是多余的。

方法2:过滤掉这些特殊的字符

import org.apache.commons.lang.StringUtils;

public class charUtil {

/**

* 替换四个字节的字符 '\xF0\x9F\x98\x84\xF0\x9F)的解决方案 ��

*/

public static String removeFourChar(String content) {

byte[] conbyte = content.getBytes();

for (int i = 0; i < conbyte.length; i ) {

if ((conbyte[i] & 0xF8) == 0xF0) {

for (int j = 0; j < 4; j ) {

conbyte[i j] = 0x30;// 0x30 int=48   字符=0

}

i = 3;

}

}

content = new String(conbyte);

return content.replaceAll("0000", "");

}

/**

* 将emoji表情替换成*

* @return 过滤后的字符串

* 过滤的方式很简单,直接使用正则表达式匹配编码范围,然后替换就行了。

*/

public static String filterEmoji(String source) {

if (StringUtils.isNotBlank(source)) {

return source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "*");

} else {

return source;

}

}

public static void main(String[] arg) {

try {

System.err.println("测试->将emoji表情替换成*");

String text = "This is a smiley \uD83C\uDFA6 face\uD860\uDD5D \uD860\uDE07 \uD860\uDEE2 \uD863\uDCCA \uD863\uDCCD \uD863\uDCD2 \uD867\uDD98 ";

System.out.println(text);

System.out.println(text.length());

System.out.println(text.replaceAll("[\\ud83c\\udc00-\\ud83c\\udfff]|[\\ud83d\\udc00-\\ud83d\\udfff]|[\\u2600-\\u27ff]", "*"));

System.out.println(filterEmoji(text));

//输出结果

//This is a smiley �� face�� �� �� �� �� �� ��

//45

//This is a smiley * face�� �� �� �� �� �� ��

//This is a smiley * face* * * * * * *

System.err.println("测试->替换四个字节的字符 '\\xF0\\x9F\\x98\\x84\\xF0\\x9F)的解决方案 ��");

String title = "ff的范德萨分��������Llfldakf;dsk。f������������daslfjdsa;lfkjdsd'j'l'f'k'd'j'sa'l'k";

System.out.println(removeFourChar(title));

//输出结果:ff的范德萨分Llfldakf;dsk。fdaslfjdsa;lfkjdsd'j'l'f'k'd'j'sa'l'k

} catch (Exception ex) {

ex.printStackTrace();

}

}

}来源:http://www.icode9.com/content-2-172551.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值