表面一套背地一套的不止“陰陽(yáng)合同”,最近,娛樂(lè)圈又出現(xiàn)了新的“陰陽(yáng)話題”。
【資料圖】
幾天前,#易烊千璽決定放棄入職國(guó)話#話題沖上微博熱搜,但是隨后有網(wǎng)友發(fā)現(xiàn),明明是一模一樣的字,自己手動(dòng)打出來(lái)的和上熱搜的竟然不是同一個(gè)話題。
你是不是也被這段話搞懵了?
別懷疑,這不是“李逵”和“李鬼”的差別,在微博的默認(rèn)字體下這兩個(gè)話題一模一樣,根本無(wú)法用肉眼辨認(rèn)。但是在安卓系統(tǒng)下把默認(rèn)字體換掉之后,就能看出熱搜話題的“入”字不對(duì)勁。也有網(wǎng)友稱,把兩個(gè)“入”復(fù)制在新華字典APP里,熱搜話題的“入”查不到,手動(dòng)打出的則能正常查到。
為什么會(huì)出現(xiàn)這種情況?
用python讀取字符代碼之后,可以看到熱搜里的“入”并不是中文常用字里的“入”(U+5165),因此未被字體庫(kù)收錄,連宋體、楷體、黑體等常見(jiàn)字體都沒(méi)有收錄這個(gè)字符,無(wú)論字體怎么變化,它永遠(yuǎn)停留在微軟雅黑字體上。它也不是此前大家猜測(cè)的日文字,它的真身是康熙字典里的偏旁“入”(U+2F0A)。
上圖為康熙字典偏旁“入”,下圖為漢字“入”|Unicode官方
陰陽(yáng)話題瞞天過(guò)海、一套系統(tǒng)里有兩個(gè)長(zhǎng)相一致的真假“入”字……這些事在互聯(lián)網(wǎng)的歷史上其實(shí)不新鮮,用長(zhǎng)相相似的字符騙用戶上鉤本身就是騙子們的壓箱底技能。
防不勝防的高仿賬號(hào)
難以區(qū)分的不只有“?(U+2F0A)”和“入(U+5165)”。打開(kāi)Unicode官網(wǎng),單在康熙部首的部分,容易和漢字混淆的字符就有一整頁(yè)。
除此之外,還有很多存在于不同編碼區(qū)的形近字。比如韓國(guó)地區(qū)的一些多音字,在編碼時(shí)與原有的字集是分開(kāi)的,Unicode甚至推出了一個(gè)中日韓兼容表意文字來(lái)囊括這些特例。
看上去和中文是同一個(gè)字,其實(shí)編碼完全不同
這個(gè)編碼方式兼顧了各種語(yǔ)言使用者的習(xí)慣,但帶來(lái)的問(wèn)題也顯而易見(jiàn):在電腦眼里,只要編碼不同,系統(tǒng)就會(huì)認(rèn)為是兩個(gè)完全不一樣的字,而在人類使用者看來(lái),這些字符的外觀完全相同。
這么大的漏洞,騙子當(dāng)然不會(huì)白白放過(guò)。一種名叫同形異義詞攻擊(IDN homograph attack)的網(wǎng)絡(luò)攻擊方法因此而生。早期的騙子通過(guò)用0代替O、用1代替l之類的手法來(lái)迷惑用戶,而升級(jí)版的Unicode同型字符換用則直接讓人“瞎眼”。
比如,B站上其實(shí)有兩個(gè)“老師好我叫何同學(xué)”,其中假何同學(xué)的名字中,“老師好”的“老(U+F934)”使用的是中日韓兼容表意文字中的編碼。
左:老(U+8001)師好我叫何同學(xué),右:老(U+F934)師好我叫何同學(xué)。
B站上的“真假”何同學(xué),這堪稱像素級(jí)的高仿號(hào),人眼怎么可能認(rèn)出來(lái)??!| Bilibili
不只漢字遇到了這種問(wèn)題,字母世界里的高仿騙子更離譜。
2017年,一款高仿App出現(xiàn)在谷歌官方的應(yīng)用商店里。它直接偽裝成了知名聊天軟件WhatsApp(相當(dāng)于美國(guó)微信)。開(kāi)發(fā)者在軟件名后面添加了一個(gè)不可見(jiàn)的Unicode字符,讓它看起來(lái)和正規(guī)軟件沒(méi)有區(qū)別。這個(gè)操作直接騙過(guò)了100多萬(wàn)的用戶,讓它成為了最“成功”的惡意軟件之一。
網(wǎng)址也逃不過(guò)“有人模仿我的臉”。隨著國(guó)際化域名開(kāi)放使用Unicode,你看到的“英文”也可能不是英文了!比如www.арр?е.com這個(gè)網(wǎng)址,如果你復(fù)制到瀏覽器里,瀏覽器會(huì)告訴你……
這個(gè)看起來(lái)和蘋(píng)果官方網(wǎng)站一模一樣的網(wǎng)址,是計(jì)算機(jī)愛(ài)好者Xudong Zheng申請(qǐng)的。網(wǎng)址中的а(U+0430)不是英文字母,而是西里爾字母,只要點(diǎn)進(jìn)去就會(huì)進(jìn)入Xudong Zheng的“釣魚(yú)網(wǎng)站”。類似的
同形異義詞攻擊也常被用在垃圾郵件和病毒文件里。
“罪魁禍?zhǔn)住盪nicode
然而,這么“不科學(xué)”的Unicode,已經(jīng)是人類現(xiàn)階段最通用、最好的字符解決方案。
要讓計(jì)算機(jī)理解人類的語(yǔ)言文字,就需要建立人類與計(jì)算機(jī)之間相互理解的橋梁,也就是說(shuō)需要一種將字符轉(zhuǎn)換為數(shù)字的編碼方式。
上世紀(jì)60年代,在計(jì)算機(jī)誕生之初,美國(guó)人采用了一種編碼來(lái)表示英語(yǔ)以及各種符號(hào)。該編碼只有一個(gè)字節(jié),能表示256(2^8)個(gè)字符(8個(gè)二進(jìn)制數(shù)),雖然只定義了128個(gè)字符,但已經(jīng)足夠涵蓋大小寫(xiě)英文字母和一些常用符號(hào),這就是大名鼎鼎的ASCII編碼。
1972年之前使用的ASCII編碼表,當(dāng)時(shí)的電腦只認(rèn)得這些字|wikipedia
然而隨著計(jì)算機(jī)技術(shù)的發(fā)展,單純的英文字符逐漸不夠用了。漢語(yǔ)、法語(yǔ)、日語(yǔ)等各種語(yǔ)言的需求增加,每種新語(yǔ)言都需要新的字符。于是每個(gè)國(guó)家也都紛紛著手創(chuàng)建自己的編碼方案,比如我國(guó)的GB 2312、GBK。
不同的國(guó)家和地區(qū)各自使用不同編碼的結(jié)果,就是計(jì)算機(jī)每次都要安裝不同的解碼軟件,一旦出現(xiàn)解碼錯(cuò)誤,用戶就只能看到一堆亂碼。
一些讓人頭大的亂碼,網(wǎng)上沖浪夠久總能見(jiàn)到
這時(shí)候,一些國(guó)際組織開(kāi)始擬定統(tǒng)一的字符編碼方案,為每種語(yǔ)言中的每個(gè)字符設(shè)定唯一的二進(jìn)制編碼,以滿足跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求,Unicode就是這么誕生的。在這種語(yǔ)言環(huán)境下,不需要再對(duì)文件進(jìn)行單獨(dú)解碼,同屏里可以顯示任何語(yǔ)言的內(nèi)容。
Unicode用數(shù)字0-0x10FFFF來(lái)映射這些字符,最多可以容納1114112個(gè)字符,或者說(shuō)有1114112個(gè)碼位。碼位就是可以分配給字符的數(shù)字。UTF-8、UTF-16、UTF-32都是將數(shù)字轉(zhuǎn)換到程序數(shù)據(jù)的編碼方案。將字符轉(zhuǎn)換為數(shù)字、字符編碼可以簡(jiǎn)單理解為,
將每個(gè)字符分配給一個(gè)數(shù)字
,例如:a = 65,A = 97。如果這個(gè)編碼是統(tǒng)一的,那全世界所有的計(jì)算機(jī)就都可以認(rèn)識(shí)這些字符。
我們已經(jīng)給每個(gè)字符分配了一個(gè)唯一的編碼,那么如何使計(jì)算機(jī)認(rèn)識(shí)這個(gè)編碼呢?由于計(jì)算機(jī)只懂得0、1這樣的二進(jìn)制,最簡(jiǎn)單的方式就是直接將編碼轉(zhuǎn)換成2進(jìn)制,例如:It’s 果殼的Unicode編碼如下:
其對(duì)應(yīng)的二進(jìn)制為:
1991年Unicode發(fā)布之初,一共只支持7161個(gè)字符,雖然已經(jīng)比128個(gè)ASCII編碼多了不少,但仍然不足以滿足全球用戶的需求。在接下來(lái)的幾十年里Unicode不斷迭代,支持的語(yǔ)言更多,數(shù)量也激增至14萬(wàn)個(gè),其中不僅有緬甸文、藏文這樣經(jīng)常被我們拿來(lái)做表情包的字符,甚至還包括麻將、易經(jīng)卦象、多米諾骨牌牌面這樣的非語(yǔ)言符號(hào)。
在添加Unicode時(shí),需要秉承“統(tǒng)一性(Unification)”的準(zhǔn)入原則,即把不同語(yǔ)言的同一書(shū)寫(xiě)系統(tǒng)(scripts)中相同的字符統(tǒng)一起來(lái),因此中日韓文中相同的漢字的編碼是一致的。但與此同時(shí),豐富的語(yǔ)言中也包含著大量的形近字,比如西里爾字母中的一些字符就和英文字母高度相似,真的沒(méi)什么好方法辨認(rèn),只能查看代碼。
西里爾字母表|wikipedia
借我借我一雙慧眼吧
雖然那英借來(lái)的慧眼不一定能幫上什么忙,但我們還是能用一些別的方法看破真相。
對(duì)于用Unicode渾水摸魚(yú)的“冒牌”網(wǎng)站,各家瀏覽器已經(jīng)開(kāi)始將網(wǎng)址轉(zhuǎn)換為統(tǒng)一的Ponycode代碼進(jìn)行顯示了。而且對(duì)于這種高仿網(wǎng)站,瀏覽器自身也有了相應(yīng)的比對(duì)和審核方法,并及時(shí)提醒用戶可能存在的風(fēng)險(xiǎn)。
瀏覽器會(huì)將Unicode字符轉(zhuǎn)換為統(tǒng)一的編碼,在一定程度上抵抗釣魚(yú)網(wǎng)站
對(duì)于高仿賬號(hào)和頁(yè)面上顯示的文字,通過(guò)改變字體也可以快速找到貓膩。Unicode本身并不代表任何字體,最終文字的顯示效果和系統(tǒng)的呈現(xiàn)方式有很大關(guān)系。因此,有些字體只會(huì)顯示Unicode中的部分字符,那些沒(méi)有適配的文字就會(huì)顯得很不一樣。
字體改為楷體時(shí),第二個(gè)老字明顯不一樣了
不過(guò)換字體這一招也不是百試百靈。目前有很多網(wǎng)站為了統(tǒng)一風(fēng)格,會(huì)在代碼中指定顯示的字體,不受用戶改變自己系統(tǒng)字體的影響。所以遇到可疑的情況,最根本的方法還是得把文字復(fù)制下來(lái),查詢Unicode編碼。
用python3可以很簡(jiǎn)單地查到一個(gè)字符的Unicode編碼,如下面的代碼所示:
這段代碼可以通過(guò)四個(gè)步驟來(lái)進(jìn)行:
環(huán)境準(zhǔn)備。打開(kāi)電腦自帶的Terminal,輸入python3+回車(chē),即可進(jìn)入python交互環(huán)境,就可以開(kāi)始寫(xiě)代碼啦。
變量賦值。將想要查詢的字符給到變量s,例如我們想查詢“老”這個(gè)字符的Unicode編碼,就輸入s = "老"。
Unicode編碼查詢。Python內(nèi)置的encode函數(shù)可以用來(lái)查詢Unicode碼,在encode函數(shù)的參數(shù)中輸入"unicode_escape",代表我們想要查詢的編碼類型是Unicode。輸入re = s.encode("unicode_escape"),就可以調(diào)取編碼。
最后輸入print(re),就可以看到字符的Unicode碼,對(duì)比任意兩個(gè)字符的編碼是否一致。
希望大家面對(duì)所謂的“陰陽(yáng)熱搜”不再困惑,在Unicode騙局面前用技術(shù)工具保護(hù)自己!
關(guān)鍵詞: unicode
網(wǎng)站首頁(yè) |網(wǎng)站簡(jiǎn)介 | 關(guān)于我們 | 廣告業(yè)務(wù) | 投稿信箱
Copyright © 2000-2020 hngelin.com All Rights Reserved.
中國(guó)網(wǎng)絡(luò)消費(fèi)網(wǎng) 版權(quán)所有 未經(jīng)書(shū)面授權(quán) 不得復(fù)制或建立鏡像
聯(lián)系郵箱:920 891 263@qq.com
方正县| 嘉兴市| 台山市| 黔东| 定边县| 且末县| 英德市| 凤城市| 青田县| 门头沟区| 恩施市| 洱源县| 乌拉特中旗| 景洪市| 兴化市| 凤台县| 白玉县| 青海省| 安溪县| 闽侯县| 龙陵县| 万州区| 会昌县| 繁峙县| 达日县| 东源县| 鄂托克前旗| 临猗县| 元谋县| 长泰县| 夏河县| 东乡县| 清水县| 宜城市| 乌拉特中旗| 北辰区| 泰安市| 冕宁县| 阿克苏市| 冀州市| 读书|