在不升级 mysql 的情况下直接使用 mysql utf8 存储 超过三个字节的 emoji 表情

由于现在数据库的版本是5.5.2,但是看网上说要直接存储emoji表情,需要升级到5.5.3然后把字符集设置为utf8mb4,但是升级数据库感觉属于敏感操作。

考虑了多久之后直接考虑使用正则来替换,但是emoji表情的unicode码太多了,在网上找了一份代码,还是2年前更新的,想了想还是算了。

PHP 版本

最简单的办法就是直接找到接受到的文本中的字符串中4个字节的内容,做rawurlencode编码,再入库。输出的时候再替换回来,然后再用rawurldecode转码回unicode到手机再解析为emoji表情。

获取字符串长度mb_strlen,按字符来截取字符串mb_substrmb_strcut是按字节来截取,有区别)。

存储

$strEncode = '';

$length = mb_strlen($str,'utf-8');

for ($i=0; $i < $length; $i++) {
    $_tmpStr = mb_substr($str,$i,1,'utf-8');
    if(strlen($_tmpStr) >= 4){
        $strEncode .= '[[EMOJI:'.rawurlencode($_tmpStr).']]';
    }else{
        $strEncode .= $_tmpStr;
    }
}

echo $strEncode."\n";// 周梦康123~[[EMOJI:%F0%9F%98%81]][[EMOJI:%F0%9F%98%84]]

读取

//转码回去
$strDecode = preg_replace_callback("/\[\[EMOJI:(.*?)\]\]/", function($matches){
    return rawurldecode($matches[1]);
}, $strEncode);

echo $strDecode."\n";

php 就这么轻松愉快的解决了。

Java 版本

考虑到想使用php里面的套路,对原字符串逐个字符获取其长度,如果超过3个字节,那么则编码下,就能存储了,依照上次的经验,我写了如下代码

String a = "\uD83D\uDE01";// 一个 emoji 表情
byte[] bytes = a.getBytes("utf-8");
System.out.println(bytes.length);// 输出 4

单个单个的来,能获取到正确的字节数,但是如何保证切割字符串的时候是正确的呢?我找遍了城市所有的街道,都没有,找到我要的方法.

import java.net.URLEncoder;
import java.net.URLDecoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.UnsupportedEncodingException;

public class test{

    public static void main(String[] args) throws Exception {
        String content = args[0];
        System.out.println(content);

        int strLength = content.length();

        String filterContent = emojiFilter(content);
        System.out.println(filterContent);

        String emojiStr = emojiRecovery(filterContent);
        System.out.println(emojiStr);
    }

    private static String emojiFilter(String str){
        String patternString = "([\\x{10000}-\\x{10ffff}\ud800-\udfff])";

        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(str);

        StringBuffer sb = new StringBuffer();
        while(matcher.find()) {
            try {
                matcher.appendReplacement(sb, "[[EMOJI:" + URLEncoder.encode(matcher.group(1),"UTF-8") + "]]");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        matcher.appendTail(sb);

        return sb.toString();
    }

    private static String emojiRecovery(String str){
        String patternString = "\\[\\[EMOJI:(.*?)\\]\\]";

        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(str);

        StringBuffer sb = new StringBuffer();
        while(matcher.find()) {
            try {
                matcher.appendReplacement(sb, URLDecoder.decode(matcher.group(1),"UTF-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        matcher.appendTail(sb);

        return sb.toString();
    }
}

时间: 2024-11-03 17:36:18

在不升级 mysql 的情况下直接使用 mysql utf8 存储 超过三个字节的 emoji 表情的相关文章

求教:不适应MySQL的情况下,如何在finereport中设计PDF文件?

问题描述 求教:不适应MySQL的情况下,如何在finereport中设计PDF文件? 请简要概述一下如何设计PDF文件及如何使用MyEclipse导出设PDF文件的过程! 谢谢! 谢谢! 谢谢!

什么情况下需要创建MySQL索引?_Mysql

索引可以提高数据的检索效率,也可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本.排序分组操作主要消耗的就是CPU资源和内存,所以能够在排序分组操作中好好的利用索引将会极大地降低CPU资源的消耗. 如何判定是否需要创建索引? 1.较频繁地作为查询条件的字段 这个都知道.什么是教频繁呢?分析你执行的所有SQL语句.最好将他们一个个都列出来.然后分析,发现其中有些字段在大部分的SQL语句查询时候都会用到,那么就果断为他建立索引. 2.唯一性太差的字段不适合建立索引 什么是唯一性太差的字段.

mysql在什么情况下免费啊

问题描述 mysql在什么情况下免费啊 mysql在什么情况下免费啊,licence中的内容看不懂. 解决方案 mysql本来就是开源的.免费的啊. 解决方案二: 在自己用的情况下啊,只要不作为商业用途 都可以的啊 解决方案三: MySQL是一种非常流行的开放源代码数据库系统.它不但是一种用途广泛的大型数据库工具,而且完全免费,用户甚至可能不用掏一个子儿就可以很容易地掌握它 解决方案四: 直接就是免费,商业也可以.没什么问题. 解决方案五: 社区版是免费的,商业版的不被发现也没什么问题. 解决方

MySQL中文参考手册5(安装MySQL下)

mysql|参考|参考手册|中文 MySQL中文参考手册5(安装MySQL下)转载 译者:晏子 [返回][转发] 译者:晏子 (clyan@sohu.com)主页:http://linuxdb.yeah.net 4.12 Win32 注意事项这节描述在Win32上安装和使用MySQL,这也在MySQL Win32分发所带的"readme"文件中描述.  4.12.1 在Win32上安装MySQL如果你没有一个注册的MySQL版本,你应该首先下载共享软件版本,从:  MySQL 3.21

Linux下彻底卸载mysql详解_Mysql

一.使用以下命令查看当前安装mysql情况,查找以前是否装有mysql rpm -qa|grep -i mysql 可以看到如下图的所示: 显示之前安装了:      MySQL-client-5.5.25a-1.rhel5      MySQL-server-5.5.25a-1.rhel5 2.停止mysql服务.删除之前安装的mysql 删除命令:rpm -e –nodeps 包名 rpm -ev MySQL-client-5.5.25a-1.rhel5 rpm -ev MySQL-serv

CentOS下nginx+php-fpm+mysql主机分离环境实例教程

实验系统:CentOS 6.6_x86_64 实验前提:大部分软件使用编译安装,请提前准备好编译环境,防火墙和selinux都关闭 实验软件:nginx-1.9.3 mariadb-10.0.20 php-5.6.11 memcache-2.2.7 xcache-3.2.0 实验拓扑: 一.安装nginx 1.解决依赖关系: 需要专门安装pcre-devel包: yum -y install pcre-devel 2.添加nginx用户: useradd -r nginx 3.解压并编译安装ng

window 下忘记了mysql 密码的解决方法

1.以管理员身份打开cmd,关闭MySQL. net stop mysql 2.跳过权限检查启动,进入安装目录bin下. mysqld --skip-grant-tables或者mysqld-nt --skip-grant-tables 这里可能出现问题,如果失败的话,找到配置文件my.ini,打开并在[mysqld]下面加入skip-grant-tables.再执行上面一行命令. 3.不关闭当前窗口,再打开另一个命令行窗口.输入mysql回车,如果进入不了mysql>,就先去到mysql\bi

MySQL中文参考手册2(MySQL 的一般信息)

mysql|参考|参考手册|中文 MySQL中文参考手册2(MySQL 的一般信息)转载 翻译:晏子 [返回][转发] 译者:晏子 (clyan@sohu.com)主页:http://linuxdb.yeah.net 1 MySQL 的一般信息这是MySQL参考手册:它记载了MySQL版本3.23.7-alpha. MySQL 是一个快速.多线程.多用户和强壮的SQL数据库服务器. 对Unix和 OS/2 平台,MySQL基本上是免费的:但对微软平台,你在30 天的试用期后必须获得一个MySQL

mysql支持IOS的Emoji表情

原因: UTF-8编码有可能是两个.三个.四个字节.Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去. 解决办法: 将Mysql的编码从utf8转换成utf8mb4 步骤: 1.修改mysql配置文件 my.ini default-character-set=utf8mb4 character-set-server=utf8mb4 2.加入 [client] port=3306 default-character-set=utf8mb4 [mysqld]下加入