表情符号mysql utf8mb4_mysql utf8mb4与emoji表情

一 什么是Emoji

emoji就是表情符号;词义来自日语(えもじ,e-moji,moji在日语中的含义是字符)

表情符号现已普遍应用于手机短信和网络聊天软件。

emoji表情符号,在外国的手机短信里面已经是很流行使用的一种表情。

手机上如何使用emoji:

1.iphone、ipad系统:安装emoji free,再设置-通用-键盘-国际键盘-添加新的键盘,然后把emoji添加在里面即可在发短信和一些输入文本的文本框中输入表情。

IOS 5用户可直接从通用中添加emoji 键盘,无需再安装emoji free

2.android系统:安装“GO输入法国际版”后,在输入法里面点选安装emoji插件可以使用。另外“百度输入法”也自带emoji表情

3.Windows Phone : 安装此 Emoji Keys,在其中输入之后复制粘贴到需要输入表情的地方即可

69460d5ced4df8e17402ec9ce0273fa6.png

二 Emoji表情符号问题

1 问题:

IOS版本之间发送的Emoji表情符号不兼容,只看到方块

不同IOS版本在数据库存数据时,有时会发生系统错误

2 现象:

IOS 4 输入Emoji表情符,在IOS5.01 显示正常,在IOS5.1中(大陆版)显现为方块, 但IOS5.01/5.1输入的表情符号,显示正      常

IOS5.01/5.1 输入表情符,在IOS5.01/5.1中显示正常,但在IOS4.X显示为方块

输入Emoji入帖子正文, 可正常存储。 但用户昵称在IOS4.X 输入Emoji,系统正常, 而IOS5.01/5.1则提示系统错误。

3 本质:

iOS 5 and OS X 10.7 (Lion) use the Unicode 6.0 standard ‘unified’ code points for emoji.

iOS 5 Emoji  采用Unicode 6 标准来统一code points

iOS 4 on SoftBank iPhones used a set of unofficial code points in the Unicode Private Use Area, and so aren't      compatible with any other systems

iOS 4 采用SoftBank Unicode, 一种非官方的, 采用私有Unicode 区域。

4 举例:

1337239183_2228.pngone emoji symbol "tiger", it is "\U0001f42f" in iOS5, but "\ue050" in earlier iOS version

虎脸Emoji符号在iOS5 为Unicode:\U0001f42f;而在IOS4.x 为:\ue050 (SoftBank 编码)

另外: 按理讲, 从iOS5 应该兼容以前版本的emoji, 但现在出现5.01版本完美兼容(无论大陆版,美版,还是港版), 而5.1     大陆版出现了不兼容现象(腾讯微信也出现了同样的问题)。

三 问题分析

1 系统存储错误问题(如昵称,帖子内容)

原因:

由于IOS5.X 采用新的Unicode, 其UTF8 编码大多为4个字节, 而由于昵称/帖子内容column并没设成utf8mb4,因此存储会    发生错误。

解决方法:

将昵称/帖子内容设成utf8mb4

2 不同iOS 之间Emoji 不兼容的问题。

原因:

iOS 5 到4 不兼容的问题,很简单,unicode6 和softbank编码的不同

iOS 4 到 5,按理说应该兼容,也就是说,iOS应该自动判断如果是softbank编码,自动转成unicode6。但现在看来, iOS5.1(大陆版)好像只支持unicode6, 而不支持softbank.

解决方法:

客户端发送emoji-encoding: Softbank或unicode6, 由服务端分别给出相应的编码表。

四 解决方案

1 数据存储(MySQL varchar  数据类型对UTF8 支持问题)

MYSQL 5.5 之前, UTF8 编码只支持1-3个字节, 从MYSQL5.5开始,可支持4个字节UTF编码,但要特殊标记。例如我们的帖子内容项,我们加上了这个支持。服务端mysql统一存储为ios5.x也就是Unicode编码。

对应alter语句:

ALTER TABLE topic MODIFY COLUMN content varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '内容';

2 编码转换:

iphone手机方案

客户端输入内容时候,统一存储为unicode编码(这里需要从softbank编码转换为unicode编码)。客户端请求内容的时候,需要根据不同的客户端给出不同的编码,ios4采用softbank编码做替换,ios5采用unicode编码直接支持。

android或wp其他手机方案:

如果没有emoji表情库,将无法输入。针对输入问题,将统一采用unicode编码存储。客户端请求内容的时候,将统一用softbank编码,客户端需要把emoji表情符号内置到客户端,做对应的编码和img替换。

web解决方案:

参考android或wp其他手机方案

五 部分代码

1 sql代码

CREATE TABLE`ios_emoji` (

`id`int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',

`unicode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Unicode编码',

`utf8`varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'UTF8编码',

`utf16`varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'UTF16编码',

`sbunicode`varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'SBUnicode编码',

`filename`varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文件名',

`filebyte` longblob COMMENT'文件内容字节',PRIMARY KEY(`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='ios表情编码表';

2 java代码

importjava.io.UnsupportedEncodingException;importorg.apache.commons.lang.StringUtils;public classIOSEmojiUtil {public staticString[] ios5emoji ;public staticString[] ios4emoji ;public staticString[] androidnullemoji ;public staticString[] adsbuniemoji;public static voidinitios5emoji(String[] i5emj,String[] i4emj,String[] adnullemoji,String[] adsbemoji){

ios5emoji=i5emj;

ios4emoji=i4emj;

androidnullemoji=adnullemoji;

adsbuniemoji=adsbemoji;

}//在ios上将ios5转换为ios4编码

public staticString transToIOS4emoji(String src) {returnStringUtils.replaceEach(src, ios5emoji, ios4emoji);

}//在ios上将ios4转换为ios5编码

public staticString transToIOS5emoji(String src) {returnStringUtils.replaceEach(src, ios4emoji, ios5emoji);

}//在android上将ios5的表情符替换为空

public staticString transToAndroidemojiNull(String src) {returnStringUtils.replaceEach(src, ios5emoji, androidnullemoji);

}//在android上将ios5的表情符替换为SBUNICODE

public staticString transToAndroidemojiSB(String src) {returnStringUtils.replaceEach(src, ios5emoji, adsbuniemoji);

}//在android上将SBUNICODE的表情符替换为ios5

public staticString transSBToIOS5emoji(String src) {returnStringUtils.replaceEach(src, adsbuniemoji, ios5emoji);

}//eg. param: 0xF0 0x9F 0x8F 0x80

public static String hexstr2String(String hexstr) throwsUnsupportedEncodingException{byte[] b =hexstr2bytes(hexstr);return new String(b, "UTF-8");

}//eg. param: E018

public static String sbunicode2utfString(String sbhexstr) throwsUnsupportedEncodingException{byte[] b =sbunicode2utfbytes(sbhexstr);return new String(b, "UTF-8");

}//eg. param: 0xF0 0x9F 0x8F 0x80

public static byte[] hexstr2bytes(String hexstr){

String[] hexstrs= hexstr.split(" ");byte[] b = new byte[hexstrs.length];for(int i=0;i

b[i]= hexStringToByte(hexstrs[i].substring(2))[0];

}returnb;

}//eg. param: E018

public static byte[] sbunicode2utfbytes(String sbhexstr) throwsUnsupportedEncodingException{int inthex = Integer.parseInt(sbhexstr, 16);char[] schar = {(char)inthex};byte[] b = (new String(schar)).getBytes("UTF-8");returnb;

}public static byte[] hexStringToByte(String hex) {int len = (hex.length() / 2);byte[] result = new byte[len];char[] achar =hex.toCharArray();for (int i = 0; i < len; i++) {int pos = i * 2;

result[i]= (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));

}returnresult;

}private static byte toByte(charc) {byte b = (byte) "0123456789ABCDEF".indexOf(c);returnb;

}public static void main(String[] args) throwsUnsupportedEncodingException {//TODO Auto-generated method stub

byte[] b1 = {-30,-102,-67}; //ios5//0xE2 0x9A 0xBD

byte[] b2 = {-18,-128,-104}; //ios4//"E018"//-------------------------------------

byte[] b3 = {-16,-97,-113,-128}; //0xF0 0x9F 0x8F 0x80

byte[] b4 = {-18,-112,-86}; //E42A

ios5emoji= new String[]{new String(b1,"utf-8"),new String(b3,"utf-8")};

ios4emoji= new String[]{new String(b2,"utf-8"),new String(b4,"utf-8")};//测试字符串

byte[] testbytes = {105,111,115,-30,-102,-67,32,36,-18,-128,-104,32,36,-16,-97,-113,-128,32,36,-18,-112,-86};

String tmpstr= new String(testbytes,"utf-8");

System.out.println(tmpstr);//转成ios4的表情

String ios4str =transToIOS5emoji(tmpstr);byte[] tmp =ios4str.getBytes();//System.out.print(new String(tmp,"utf-8"));

for(byteb:tmp){

System.out.print(b);

System.out.print(" ");

}

}

}

六 参考资料

1 Emoji 全编码表:(我参考的这个)

http://punchdrunker.github.com/iOSEmoji/table_html/flower.html

2 Emoji全编码表

http://code.iamcal.com/php/emoji/

3 iOS5/4 Emoji  兼容性:

http://stackoverflow.com/questions/7856775/how-to-convert-the-old-emoji-encoding-to-the-latest-encoding-in-ios5

4 MySQL emoji问题

http://dropblood.com/archives/ios-mysql-emoji

5 Emoji 中文对应表

http://www.iapps.im/wp-content/uploads/2012/02/emoji-pinyin.png?r=010

七 下载资源

emoji图片和编码表 http://download.csdn.net/detail/qdkfriend/4309051

包括emoji文件表,emoji数据编码表(Unicode编码,UTF8编码,UTF16编码,SBUnicode编码)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html自适应_web前端入门到实战:HTML 文档流,设置元素浮动,导致父元素高度无法自适应的解决方法...

元素浮动定义float 属性定义元素在哪个方向浮动。以往这个属性总应用于图像&#xff0c;使文本围绕在图像周围&#xff0c;不过在 CSS 中&#xff0c;任何元素都可以浮动。浮动元素会生成一个块级框&#xff0c;而不论它本身是何种元素。如果浮动非替换元素&#xff0c;则要指定…

idea 远程调试_我的天!你竟然不会用IDEA远程调试Tomcat...

# 准备工作明确的远程服务器的IP地址&#xff0c;某些我是&#xff1a;192.168.92.128关掉服务器防火墙&#xff1a;service iptables stop# 本地远程服务器配置添加远程服务器&#xff0c;如下图复制远程服务器自动生成的JVM参数&#xff0c;等下有用&#xff0c;如下图&#…

跨域获取后台数据undefined_同源策略amp;JSONP跨域

同源策略&JSONP跨域同源策略 对于同源的定义&#xff0c;MDN给出了这样的解释&#xff1a;如果两个页面的协议&#xff0c;端口&#xff08;如果有指定&#xff09;和主机都相同&#xff0c;则两个页面具有相同的源。如何确定两个页面是否同源&#xff0c;只要比较两个页面…

python 除数不能为零的报错有哪些_【社区精选40】Python错误处理及代码调试方法(文末赠书中奖名单)...

本文整理自爱数据学院中的问答更多精彩问答&#xff0c;进入下方社区网站查看http://www.lovedata.cn/invitation社区精选话题 第40期Python错误处理及代码调试方法一次写完代码程序并能够正常运行的概率很小很小&#xff0c;总会有各种各样的错误bug需要处理。有的报错简单&a…

mac mysql prefpane_【MySQL数据库开发之一】Mac下配置安装数据库-MySQL

本站文章均为那么从今天开始陆续会更新数据库和Hibernate框架的博文&#xff0c;也是Himi学习的历程记录&#xff0c;希望大家能共同讨论和研究&#xff1b;OK&#xff0c;本篇简单介绍安装吧&#xff0c;首先到MySQL官方网站&#xff1a;如上图&#xff1a;点击DOWNLOAD &…

系统新模块增加需要哪些步骤_想要吸引人流,儿童乐园需要增加哪些新设备呢...

儿童乐园是现今最火爆的一个投资项目&#xff0c;因为它的主要消费群体是孩子&#xff0c;而现在的家长们对孩子们的宠爱&#xff0c;基本都会答应让孩子们去儿童乐园里面玩耍。但是儿童乐园的投资经营者也会遇见一些小问题&#xff0c;例如儿童乐园添加设备要怎么选择呢&#…

照片打印预览正常打印空白_小米发布口袋照片打印机,可无墨打印3寸背胶照片...

9月11日消息&#xff0c;小米推出一款小米口袋照片打印机。与之前的小米米家照片打印机相比&#xff0c;这款新品更加小巧便携&#xff0c;体积接近充电宝大小&#xff0c;净重仅181g&#xff0c;便于随身携带。小米口袋照片打印机采用ZINK无墨技术打印&#xff0c;即使用嵌入纸…

MySQL优化调优有没有做过_MySQL 调优/优化的 100 个建议

MySQL是一个强大的开源数据库。随着MySQL上的应用越来越多&#xff0c;MySQL逐渐遇到了瓶颈。这里提供 101 条优化 MySQL 的建议。有些技巧适合特定的安装环境&#xff0c;但是思路是相通的。我已经将它们分成了几类以帮助你理解。MySQL监控MySQL服务器硬件和OS(操作系统)调优&…

mysql核心参数_MySQL技术体系之核心参数

本文主要基于MySQL 5.7版本的数据库环境&#xff0c;总结my.cnf文件中核心参数的配置使用&#xff0c;让更多的人对MySQL技术体系有更全面、更专业的深度了解。一、客户端核心参数1、port端口号&#xff0c;默认33062、socketSocket文件地址&#xff0c;默认以.sock为文件名称后…

jtag引脚定义_从逆向分析的角度学习硬件调试技巧JTAG,SSD和固件提取

我想从逆向的角度做了深入了解JTAG&#xff0c;JTAG是许多嵌入式CPU使用的硬件级别调试机制&#xff0c;我希望通过这篇文章从逆向工程师的角度解释如何使用JTAG&#xff0c;并在此过程中提供一些实际示例。0x01 研究目标通过这篇文章&#xff0c;我希望做到以下几点&#xff1…

python virtualenv conda_在vscode中启动conda虚拟环境的思路详解

问题&#xff1a;cudatoolkit cudnn 通过conda 虚拟环境安装&#xff0c;先前已经使用virtualenv安装tf&#xff0c;需要在conda虚拟环境中启动外部python虚拟环境思路&#xff1a;conda prompt即将 [虚拟环境位置] 以参数形式传入 [activate.bat]VSOCDE中的设置添加以下语句{&…

远程过程调用失败_Java开发大型互联网RPC远程调用服务实现之问题处理方案

引言RPC(Remote Procedure Call Protocol)——远程过程调用协议&#xff0c;它是一种通过网络从远程计算机程序上请求服务&#xff0c;而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在&#xff0c;如TCP或UDP&#xff0c;为通信程序之间携带信息数据。在OSI网络…

chrome 新的session 设置_为什么还是由这么多人搞不懂Cookie、Session、Token?

作者&#xff1a;不学无数的程序员链接&#xff1a;https://urlify.cn/Yfm6Vr# Cookie洛&#xff1a;大爷&#xff0c;楼上322住的是马冬梅家吧&#xff1f; 大爷&#xff1a;马都什么&#xff1f; 夏洛&#xff1a;马冬梅。 7大爷&#xff1a;什么都没啊&#xff1f; 夏洛…

eview面板数据之混合回归模型_【视频教程】Eviews系列25|面板数据回归分析之Hausman检验及本章常见问题解答...

点击上方关注我们!本期我们学习Eviews统计建模最后一部分--面板数据回归分析Hausman检验及本章常见问题解答。实操&#xff1a;Hausman检验判断是固定效应模型还是随机效应模型上期我们讲到模型判断若选择模型2,需进一步通过Hausman检验判断固定效应还是随机效应&#xff0c;接…

mybatis mysql selectkey_Mybatis示例之SelectKey的应用

SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题&#xff0c;他可以很随意的设置生成主键的方式。不管SelectKey有多好&#xff0c;尽量不要遇到这种情况吧&#xff0c;毕竟很麻烦。SelectKey需要注意order属性&#xff0c;像Mysql一类支持自动增长类型的…

java treetable_在Swing中创建TreeTable | 学步园

TreeTable是Tree和Table的一个结合&#xff0d;就是一个即能够展开和收起行&#xff0c;同时也能够显示多个列的组件。在Swing的标准包里没有一个叫做JtreeTable的组件&#xff0c;但是我们很容易通过把Jtree做成Jtable的渲染器来创建一个这样的组件。这篇文章就是关于如何使用…

python期末大作业_大一期末考试很重要,考得好不仅有机会有钱拿,还有机会换专业...

现阶段很多高校放寒假的时间已经公布&#xff0c;这也就意味着&#xff0c;大学期末考试即将到来。对于大一新生来说&#xff0c;大学的期末考试是比较新鲜的&#xff0c;因为大家都没有经历过。经历过大学考试的学生&#xff0c;都知道大学的大概学习模式&#xff0c;一般情况…

java http 302重定向_Java 纯HTTP请求 禁止302自动重定向

Java 纯HTTP Get请求获取响应内容&#xff0c;如果发生302重定向&#xff0c;继而模拟请求域获取重定向后的响应内容。关键点&#xff1a;设置conn.setInstanceFollowRedirects为false即可示例代码public static void main(String[] args) {try {StringBuffer buffer new Stri…

python 且_Pyface库:一个基于pyqt、pyside、wx且简化的python的GUI

1 说明&#xff1a;1.1 Pyface库由大名鼎鼎的enthought出品。1.2 介绍&#xff1a;1.2.1 英文&#xff1a;traits-capable windowing framework.The pyface project contains a toolkit-independent GUI abstraction layer, which is used to support the "visualization&…

java方法的参数类型_Java 基础 14 方法的重载 与 方法参数类型详解

1.1 方法重载的概述和特点方法重载概述在同一个类中&#xff0c;允许存在一个以上的同名方法&#xff0c;只要它们的参数个数或者参数类型不同即可。方法重载特点与返回值类型无关&#xff0c;只看方法名和参数列表在调用时&#xff0c;虚拟机通过参数列表的不同来区分同名方法…