Emoji表情在AndroidJNI中的兼容性問題分析是怎樣的

這篇文章跟大家分析一下“Emoji表情在AndroidJNI中的兼容性問題分析是怎樣的”。內(nèi)容詳細(xì)易懂,對(duì)“Emoji表情在AndroidJNI中的兼容性問題分析是怎樣的”感興趣的朋友可以跟著小編的思路慢慢深入來閱讀一下,希望閱讀后能夠?qū)Υ蠹矣兴鶐椭?。下面跟著小編一起深入學(xué)習(xí)“Emoji表情在AndroidJNI中的兼容性問題分析是怎樣的”的知識(shí)吧。

在羅平等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),成都全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站建設(shè),羅平網(wǎng)站建設(shè)費(fèi)用合理。

起因

最近遇到一個(gè)問題,把某個(gè)字符串計(jì)算MD5,之后把該字符串加密與MD5一起上傳到服務(wù)端,服務(wù)端解密后重新計(jì)算md5發(fā)現(xiàn)與上傳的MD5不一致,而出問題的字符串中無一例外都有Emoji表情。但我自己弄個(gè)帶表情的字符串上傳卻沒有什么問題。

最終確認(rèn)這是在Android 5.1以下 jstring -> char數(shù)組 時(shí)出的問題。下面通過一個(gè)示例來還原這個(gè)過程。

事件還原

假設(shè)有一個(gè)字符串s,String s = "\uD83D\uDC8B"; ,對(duì)應(yīng)表情?。通過調(diào)用getBytes()方法,會(huì)看到對(duì)應(yīng)的byte數(shù)組為[-16, -97, -110, -117] ,按16進(jìn)制輸出為[f0, 9f, 92, 8b] 。

定義一個(gè)參數(shù)為String的native方法,public native String test(String str); ,在對(duì)應(yīng)的C/C++代碼中,通過env->GetStringUTFChars獲取傳入的String對(duì)應(yīng)的char數(shù)組,把char數(shù)組的每一個(gè)元素按16進(jìn)制輸出。

在Android 7.1.2的測(cè)試機(jī)上,native層輸出的結(jié)果為[f0, 9f, 92, 8b] ,與Java的byte數(shù)組是一樣的,但是在Android 4.4.4的測(cè)試機(jī)上,輸出結(jié)果為[ed, a0, bd, ed, b2, 8b] 。從而導(dǎo)致加密后的結(jié)果不一樣。

服務(wù)端收到舊版Android的數(shù)據(jù)解密后得到[ed, a0, bd, ed, b2, 8b] ,計(jì)算MD5自然無法與[f0, 9f, 92, 8b]計(jì)算MD5一樣。

Unicode、UTF-8、UTF-16

可能有人不是很清楚上面那2種byte數(shù)組是怎么來的。首先我們要知道,UTF-8和UTF-16都是Unicode的實(shí)現(xiàn)。\uD83D\uDC8B其實(shí)是UTF-16大端的表現(xiàn)形式,對(duì)于大于0xFFFF(0x10000~0x10FFFF)的Unicode,轉(zhuǎn)換為UTF-16的步驟如下:

  1. 將Unicode減去0x10000,結(jié)果將是一個(gè)長度為20bit的值。  將第一步的20bit的高10bit與0xD800進(jìn)行或運(yùn)算,得到UTF-16的高位代理。  將第一步的20bit的低10bit與0xDC00進(jìn)行或運(yùn)算,得到UTF-16的低位代理。  高位代理+低位代理即Unicode對(duì)應(yīng)的UTF-16的大端形式。

按照這個(gè)步驟反推:

  1. \uD83D\uDC8B的二進(jìn)制位1101 1000 0011 1101 1101 1100 1000 1011,則高位代理為1101 1000 0011 1101,低位代理為1101 1100 1000 1011。  高位代理由高10bit與0xD800進(jìn)行或運(yùn)算得到,因此高10bit為00 0011 1101。  低位代理由低10bit與0xDC00進(jìn)行或運(yùn)算得到,因此低10bit為00 1000 1011。  所有20bit的值為0000 1111 0100 1000 1011。  加上0x10000,為0001 1111 0100 1000 1011,即0x1F48B。

所以,表情?對(duì)應(yīng)的Unicode為0x1F48B。

UTF-8的規(guī)則是,對(duì)于占N個(gè)字節(jié)的符號(hào)(N>1),第一個(gè)字節(jié)前N位都是1,N+1位是0,后面的字節(jié)前2位為10,然后把Unicode的二進(jìn)制位填入空缺的二進(jìn)制位中,空出的位置補(bǔ)0。因此,上面的Unicode 0x1F48B轉(zhuǎn)為UTF-8需要占4個(gè)字節(jié),為:

11110 00010 01111110 01001010 001011

即0xF09F928B,這也就是[f0, 9f, 92, 8b]這個(gè)byte數(shù)組的由來。

那么[ed, a0, bd, ed, b2, 8b]這個(gè)byte數(shù)組又是怎么來的呢?這是把\uD83D\uDC8B當(dāng)成2個(gè)單獨(dú)的字符處理了,按照上面Unicode轉(zhuǎn)UTF-8的邏輯,Unicode 0xD83D轉(zhuǎn)為UTF-8為1110 1101 10 100000 10 111101,即0xEDA0BD,Unicode 0xDC8B轉(zhuǎn)為UTF-8為1110 1101 10 110010 10 001011,即0xEDB28B。

關(guān)于Emoji表情在AndroidJNI中的兼容性問題分析是怎樣的就分享到這里啦,希望上述內(nèi)容能夠讓大家有所提升。如果想要學(xué)習(xí)更多知識(shí),請(qǐng)大家多多留意小編的更新。謝謝大家關(guān)注一下創(chuàng)新互聯(lián)網(wǎng)站!

文章名稱:Emoji表情在AndroidJNI中的兼容性問題分析是怎樣的
網(wǎng)站網(wǎng)址:http://muchs.cn/article8/jcgpip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、企業(yè)建站、網(wǎng)站收錄、定制開發(fā)企業(yè)網(wǎng)站制作、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化