表情符号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;如下图&#…

mysql异步查询 java_基于 mysql 异步驱动的非阻塞 Mybatis

虽然 spring5 也推出了 WebFlux 这一套异步技术栈&#xff0c;这种极大提升吞吐的玩法在 node 里玩的风生水起&#xff0c;但 java 世界里异步依旧不是主流&#xff0c;Vertx 倒是做了不少对异步的支持&#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…

利用python批量查询企业信息_python实现批量获取指定文件夹下的所有文件的厂商信息...

本文实例讲述了python实现批量获取指定文件夹下的所有文件的厂商信息的方法。分享给大家供大家参考。具体如下&#xff1a;功能代码如下&#xff1a;import os, string, shutil,reimport pefileimport codecs, sysimport wximport struct#输出中打印Unicode字符#sys.stdout co…

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

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

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

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

php mysql 图像_php-向/从MySQL数据库插入/查看图像

我在DB中插入图像时遇到问题.该表具有以下结构&#xff1a;> id-> INT(3)->自动增量>名称-> VARCHAR(30)> extension-> VARCHAR(10)[可能太短]> img-> MEDIUMBLOB插入图像的PHP代码为&#xff1a;if($_FILES[file][error]0){$result is_uploaded_f…

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

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

c中获取python控制台输出_在真实的tim中用C捕获控制台python打印

我正在尝试从C创建一个python进程&#xff0c;并从python脚本获取打印结果。在这就是我的C代码&#xff1a;namespace ConsoleApp1{public class CreateProcess{public String PythonPath { get; set; }public String FilePath { get; set; }public String Arguments { get; se…

python三大编程语言_程序员最需要的三种编程语言

随着科学技术的进步和新技术的进步&#xff0c;编程语言的种类越来越多&#xff0c;变化是程序员需要跟踪和学习许多语言 然而&#xff0c;有太多的语言无法一一掌握 在目前的形式中&#xff0c;最需要掌握的三种编程语言是 现在判断还不晚 坦白说&#xff0c;找工作很容易 它可…

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

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

python语句print(type([1、2、3、4))_Python 学习第一天

一、学习内容1.print:表示输出print (“hello world”)单行注释&#xff1a;#多行注释&#xff1a;“““ ”””2.运算符注意&#xff1a;才表示等于&#xff0c;&#xff01;表示不等于3.位运算符&#xff5e;按位取反&#xff1a;&#xff5e;104.变量和赋值teacher“老马的…

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

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

svd降维 python案例_SVD(奇异值分解)Python实现

注&#xff1a; 在《SVD(异值分解)小结 》中分享了SVD原理&#xff0c;但其中只是利用了numpy.linalg.svd函数应用了它&#xff0c;并没有提到如何自己编写代码实现它&#xff0c;在这里&#xff0c;我再分享一下如何自已写一个SVD函数。但是这里会利用到SVD的原理&#xff0c;…

salt 启动mysql_saltsack自动化配置day03:服务部署mysql部署

一、MySQL集群需求分享1、抽象&#xff1a;功能模块把基础的写成通用服务部署也要抽象出来模块redis内存有的多&#xff0c;有的少&#xff0c;可以config set在线更改redis 安装、配置、启动mysql 安装、配置(my.cnf可以统一 目录默认配置可以统一)master: server_id 1111slav…

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中的设置添加以下语句{&…

python如何导入图片imread_OpenCV 使用imread()函数读取图片的六种正确姿势

经常看到有人在网上询问关于imread()函数读取图片失败的问题。今天心血来潮&#xff0c;经过实验&#xff0c;总结出imread()调用的四种正确姿势。通常我要获取一张图片的绝对路径是这样做的&#xff1a;在图片上右键——属性——安全——对象名称。然后复制对象名称就得到了图…