最新emoji表情代码大全_由一个 emoji 引发的思考
(給前端大全加星標(biāo),提升前端技能)
作者:大轉(zhuǎn)轉(zhuǎn)FE/張譯文
從畢業(yè)以來(lái),基本就一直在做移動(dòng)端,但是一直就關(guān)于移動(dòng)端的開發(fā),各種適配問(wèn)題的解決,在日常搬磚中處理了就過(guò)了,也沒(méi)有把東西都沉淀下來(lái),覺(jué)得甚是寒顏。現(xiàn)就一個(gè)小bug,讓我們來(lái)了解一下我們天天都在用的emoji,對(duì)于開發(fā)來(lái)說(shuō),是一個(gè)怎么樣的存在。
背景
之前在做一個(gè)留言功能時(shí),發(fā)現(xiàn)在其中一臺(tái)安卓5.0的手機(jī)上,輸入emoji糊掉了,成了如下這樣的情況?
這是skr啥玩意兒呀,怎么看上去像某白色幼蟲。
與是我又試了好幾個(gè)手機(jī),ios都沒(méi)有問(wèn)題,甚至一臺(tái)安卓機(jī)中之霸(安卓4.0),隨便進(jìn)個(gè)頁(yè)面都要加載十幾秒的手機(jī)都沒(méi)有問(wèn)題,是亂碼了嗎?
為啥emoji會(huì)出現(xiàn)亂碼呢?相信很多人都遇到過(guò)關(guān)于emoji的問(wèn)題,比如輸入emoji,傳給后端,再經(jīng)過(guò)一系列操作后從接口中取到后端返回的emoji字符就亂了。又比如為了限制輸入字?jǐn)?shù),給字符做截?cái)鄷r(shí)出現(xiàn)的問(wèn)題。
初步懷疑是編碼問(wèn)題,那我們就來(lái)看看emoji究竟是何方神圣。
emoji的歷史
emoji對(duì)于我們來(lái)說(shuō)并不陌生,我們很早就開始接觸它了。emoji這個(gè)詞來(lái)源于日語(yǔ)里的“絵文字”(假名為“えもじ”,讀音即emoji)。它是1999年,當(dāng)時(shí)還在日本無(wú)線運(yùn)營(yíng)商N(yùn)TT DoCoMo工作的Shigetaka Kurita(栗田穣崇)發(fā)明的。
emoji的編碼
emoji雖然看上去是一個(gè)有顏色有形狀的表情,但它屬于計(jì)算機(jī)中的字符。在計(jì)算機(jī)中,我們把文字、標(biāo)點(diǎn)符號(hào)、圖形符號(hào)、數(shù)字等統(tǒng)一稱為字符,由字符組成的集合,我們稱為字符集。為了讓計(jì)算機(jī)識(shí)別字符集里的字符,我們?cè)O(shè)計(jì)了一套字符集編碼規(guī)則,比如ASCII碼,由于ASCII只規(guī)定了128個(gè)字符的編碼,隨著計(jì)算機(jī)的發(fā)展,人們意識(shí)到這些編碼顯然是不夠的,為了統(tǒng)一世界上的所有字符,誕生出了Unicode字符集,而emoji字符就是Unicode字符集中的一部分。
Unicode
Unicode從0開始,為每個(gè)符號(hào)指定一個(gè)編號(hào),稱做"碼點(diǎn)",如U+0000,U+表示緊跟在后面的十六進(jìn)制數(shù)是Unicode的碼點(diǎn)。Unicode只規(guī)定了每個(gè)字符的碼點(diǎn),到底用什么樣的字節(jié)序表示這個(gè)碼點(diǎn),就涉及到編碼方法,比如我們html上常用的UTF-8。關(guān)于不同的編碼方法怎么表示Unicode,以及JavaScript是怎么處理Unicode,這里就不詳細(xì)闡述了,可參考Unicode與JavaScript詳解?鏈接地址:http://www.ruanyifeng.com/blog/2014/12/unicode.html
所以emoji作為unicode,那在計(jì)算機(jī)上是怎么顯示的?
之前我在一微信群里@我一朋友,結(jié)果出現(xiàn)了下面的情況。
@符號(hào)跑右邊去了,當(dāng)時(shí)覺(jué)得很奇怪,后來(lái)了解到,這是阿拉伯文,因?yàn)榘⒗牡臅鴮懸?guī)則是從右向左,所以@符號(hào)跑到右邊去了,可見微信對(duì)不同unicode字符排版做的兼容還挺好。再比如這幾個(gè)字符,熱?得?字?出?汗?了?。
這就涉及到了復(fù)雜文字編排(Complex text layout,縮寫:CTL)。要求復(fù)雜文字編排以適當(dāng)顯示的書寫系統(tǒng)稱為復(fù)雜文本,比如阿拉伯文字、婆羅米系文字的天城文、泰文等。
拿泰文來(lái)說(shuō),根據(jù)拼寫規(guī)則,泰文可形象地分為鞋子字符、主體字符、帽子字符、聲調(diào)字符等。泰文的每個(gè)基本字符對(duì)應(yīng)一個(gè)unicode碼,人們?cè)谳斎攵鄠€(gè)基本字符時(shí),新輸入的字符與之前的字符做匹配,如果可以組合,則這時(shí)前面的輸入就拼合成了一個(gè)泰文字符然后顯示出來(lái)。
薩瓦迪卡~
英文也是,我們?cè)谳斎胗⑽臅r(shí)會(huì)習(xí)慣以空格來(lái)拆分前后單詞,你如果輸入一串連續(xù)的英文字母,計(jì)算機(jī)在識(shí)別上也會(huì)有困難。phpisthebestlanguageintheworld(手動(dòng)滑稽臉)這句話就很有爭(zhēng)議!!
人為可以輕松識(shí)別一個(gè)泰文是否拼寫正確,但是計(jì)算機(jī)在顯示時(shí)就很難判斷。
像泰文這種特殊合成字符的本質(zhì),你無(wú)法避免人們?cè)谟?jì)算機(jī)上都會(huì)有哪些奇妙的創(chuàng)造。
于是乎,不同字符之間的組合,就誕生出了流行的顏文字:
???ﻌ???
???????-???????????
(???^???)
???(?σ????? ?σ????)·??
?(???????)??
而字符的顯示,還有一個(gè)影響就是字體,在瀏覽器中,如果對(duì)應(yīng)的編碼在字體文件中為空,一般會(huì)展示成□□□□,這樣至少不會(huì)影響排版,但是unicode作為萬(wàn)國(guó)碼實(shí)在太龐大了,在一些字體里,對(duì)一些特殊字符還是會(huì)產(chǎn)生一些錯(cuò)誤的排版,唉?~真?是惆?悵~~
對(duì)于emoji來(lái)說(shuō),它雖然也是一種特殊字符,但它并不屬于復(fù)雜文本,并且我是通過(guò)移動(dòng)終端規(guī)范輸入,排版也不會(huì)有什么問(wèn)題。我設(shè)置的font-family在其他手機(jī)上是好的也說(shuō)明,這些字體對(duì)輸入的emoji也是支持的,出問(wèn)題的終端上,非emoji的字體正常顯示,那暫時(shí)可以排除字體對(duì)emoji的影響了。
回歸問(wèn)題
到這里,還沒(méi)有解決我的問(wèn)題。本來(lái)以為是常見問(wèn)題,比如數(shù)據(jù)提交時(shí)或者數(shù)據(jù)庫(kù)儲(chǔ)存的編碼問(wèn)題。可是,我也沒(méi)傳給后端啊!我剛在自己的頁(yè)面上輸入顯示就成這樣了!
可惡,這個(gè)鍋甩不動(dòng)了。還是得自己解決,我input框剛輸入,本地看到就亂了,看來(lái)還是自己的問(wèn)題。
?我一氣之下瘋狂亂點(diǎn),發(fā)現(xiàn)不同的表情對(duì)應(yīng)的這些小蟲長(zhǎng)得還不一樣,于是,我決定把它放大看一看
?這不就是表情么,只是因?yàn)槟承┰蚩瓷先ケ粔嚎s了。我的表情啊,你到底是經(jīng)歷了什么才變得如此面目全非。我一定要找到毀你容的真兇。
先分析一下表象,emoji的顯示被截?cái)唷嚎s。為什么被壓縮?回歸場(chǎng)景,移動(dòng)端切圖,那么移動(dòng)端的多終端適配,可不可能是問(wèn)題的原因?
切圖是UI給的以iphone6的屏幕寬度為準(zhǔn)的750px2倍視覺(jué)稿,組內(nèi)方案選擇參考了手淘的flexible。具體原理和這次主題無(wú)關(guān),我就不在這里闡述了。關(guān)于移動(dòng)端多端適配方案的原理詳細(xì),可以參考?手淘H5頁(yè)面的終端適配
鏈接地址: https://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html
那么哪些代碼是影響emoji縮放的代碼呢?最先想到的是,我的emoji在輸入框里面,設(shè)置了font-size,這個(gè)font-size的值是rem, 那會(huì)不會(huì)是某些安卓系統(tǒng)emoji對(duì)rem支持不好?于是我換成px,依然如此。
那么頁(yè)面上還有哪兒還有會(huì)影響縮放呢?于是定位到了這里。
name="viewport" content="initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=0,width=device-width" />
viewport是我們?cè)O(shè)備屏幕上用來(lái)顯示網(wǎng)頁(yè)的區(qū)域,在移動(dòng)端上,viewport一般都是大于瀏覽器可視區(qū)域。
理論上,移動(dòng)端有三個(gè)viewport。
layout viewport:移動(dòng)瀏覽器為了讓所有網(wǎng)站正常顯示(包括那些PC的頁(yè)面),把默認(rèn)的viewport設(shè)為了一個(gè)較寬值,這個(gè)值一般都是大于移動(dòng)端可視區(qū)(比如iPhone 980px)。也就是document.documentElement.clientWidth
visual viewport:代表瀏覽器可視區(qū)域的大小。也就是window.innerWidth
ideal viewport:能完美適配移動(dòng)設(shè)備的viewport,用戶不需要縮放和橫向滾動(dòng)條就能完美看到網(wǎng)頁(yè)內(nèi)容,并且文字圖片,在不同分辨率屏幕下顯示出來(lái)太小應(yīng)該是差不多的(比如iPhone的ideal viewport寬度是320px)
關(guān)于各個(gè)設(shè)備的ideal viewport 可以從這里查詢,鏈接地址:http://viewportsizes.com/
所以我們利用meta標(biāo)簽,設(shè)置viewport的寬度等于設(shè)備的寬度,并且不允許用戶手動(dòng)縮放。讓viewport的寬度等于設(shè)備的寬度,這個(gè)應(yīng)該就是我們想要的理想寬度。
實(shí)際上,只設(shè)置initial-scale=1,我們也能把當(dāng)前的viewport寬度變成ideal viewport的寬度(這里不考慮iphone下不同dpr的縮放),因?yàn)檫@個(gè)縮放就是相對(duì)于ideal viewport來(lái)進(jìn)行縮放的。當(dāng)同時(shí)設(shè)置了width與initial-scale=1,瀏覽器會(huì)選擇兩者中較大的那個(gè)值。
說(shuō)了這么多,那么我的問(wèn)題出在哪兒呢?猜想是不是該安卓版本對(duì)設(shè)置width和initial-scale會(huì)有一些意想不到的問(wèn)題,于是我去掉了width=device-width,保留initial-scale=1等屬性,結(jié)果emoji竟然好了。
所以我遇到的情況就是,同時(shí)設(shè)置了width=device-width和initial-scale=1,會(huì)造成某些廠商手機(jī)的安卓5.0(目前只遇到這個(gè))emoji被拉伸,去掉width=device-width,(不寫width=device-width也就是windows phone上的IE無(wú)論是橫豎屏都把寬度設(shè)為豎屏?xí)rideal viewport寬度,個(gè)人覺(jué)得這個(gè)無(wú)傷大雅),至于為什么會(huì)這樣,我暫時(shí)只能深入到這啦 (╥╯^╰╥)
結(jié)論
每一個(gè)emoji,就是一個(gè)Unicode字符,由統(tǒng)一碼聯(lián)盟(The Unicode Consortium)來(lái)投票選拔和公布,世界各地的人們可以向聯(lián)盟提交 emoji 提案。而統(tǒng)一碼聯(lián)盟的 emoji 規(guī)范,只是定義了某個(gè)字符的語(yǔ)義,再由 Emojipedia 這個(gè)網(wǎng)站對(duì) emoji 進(jìn)行描述表達(dá),最后允許大家按照對(duì)描述的理解,自由地去設(shè)計(jì)圖案。
所以不同的廠商以及不同的系統(tǒng),甚至瀏覽器、瀏覽器版本以及系統(tǒng)字體等,對(duì)emoji的支持程度與兼容性是不一樣的。比如同一個(gè)emoji笑臉表情,在ios和安卓上顯示的效果也不一樣。為了統(tǒng)一emoji表情,很多公司都有自己的一套emoji mapping,來(lái)做Unicode碼與emoji表情的映射。
碎碎念
移動(dòng)端開發(fā)總會(huì)遇到各種問(wèn)題,有時(shí)候做兼容也會(huì)遇到無(wú)法完全兼容兩頭的情況,這時(shí)只能放棄受眾更小,選擇兼容影響面、嚴(yán)重性更大的方案了。在解決問(wèn)題的有時(shí)候深究下去,也會(huì)收獲很多。
推薦閱讀
(點(diǎn)擊標(biāo)題可跳轉(zhuǎn)閱讀)
Emoji.prototype.length —— Unicode 字符那些事兒
微信小程序之登錄態(tài)的探索
從 loading 的 9 種寫法談 React 業(yè)務(wù)開發(fā)
覺(jué)得本文對(duì)你有幫助?請(qǐng)分享給更多人
關(guān)注「前端大全」加星標(biāo),提升前端技能
喜歡就點(diǎn)一下「好看」唄~
總結(jié)
以上是生活随笔為你收集整理的最新emoji表情代码大全_由一个 emoji 引发的思考的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 产品读书《产品经理的第二本书》
- 下一篇: 五种常用大数据分析方法