表情符號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.pswp.cn/news/534007.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534007.shtml
英文地址,請注明出處:http://en.pswp.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;在圖片上右鍵——屬性——安全——對象名稱。然后復制對象名稱就得到了圖…