人人都是藝術家!談談那些奇怪的字符(上)

轉自IMWeb社區,做者:黎騰,原文連接前端

前言

編碼,是每一個程序員繞不開的話題。對於前端工程師而言,字符更是會直觀地展現在界面上。
提起文字,大部分人的腦中,都會定式爲規整排列的字符。可是林子大了什麼鳥都有,世界上但是存在着6800+種文字,不免會飛出來一些詭異的鳥…
而號稱「萬國碼」的Unicode,在實現編碼與展現的時候,也會不會遇到一些奇葩的事情呢?程序員

事實上,可能你早已見識過了:web




x̙͈̝͍͕̙̄͛̽̆͌́̕͟g̘̣̠̝̟̤̥̼̼̽͑͋̈̑̒͟͞q̛̤̦̝̘͎͋̔̋͌͒̆̋̚͡f̵̢̙͇̮̠̋̀͌̅̉̃̔͜͜͠͡r̢̜̩͙̭̲͓͈̈̀͑̆͋̚͢͜m̷̛͙̝̣̲̭͍͉̊̓̾̈̋̿̚͢͟͠s̷̡̩͔̮͈̜̊̽͂̆̈́̃̓͋̏瀏覽器


熱҈的҈字҈都҈出҈汗҈了҈

你的屏幕被藍翔挖掘機給挖壞了不信你看;̷̸̨̀͒̏̃ͦ̈́̾̀́̎͢҉̵̶͚̼͉͖̺̥͔͇̰̹̮͙͉̻̼̭̻͕̮͇ͨͬͪ͗̇̑̽͋̀̋̊͌ͧͨͭ̓̅͐ͥ̂̔̊ͧ͊҉̶̵̷̞̩̦̳̺̳̬̬̩̣̫͇̯̥͖͍͕̠̦̼̗ͯ̽͌̔ͪͯ́́͋̍ͨ̿̿̎͒ͤ̓̅̀͂ͧ͋̏ͫͣ̔͘͜͠͏̶̵̸̧̧̥̺͓̘̺͎̜̥͕͈̝̫͎̺̮̱̤̠̠͖̳̻̥̣̪͍͕͇̮͙̹̪ͮͧͫ͂͒ͤͣ̌̽ͨͪ͒̄̄̉̒̊ͩ̅͆͘̚͘͘̚͟͟͝ͅ


今天咱們就來探討一下這些奇怪的字符。前端工程師


1、文字能夠戴帽子和穿鞋子

提起泰文,不少朋友都會當即想到:薩瓦迪卡(你好)
但這句話是怎麼寫的呢?
其實這句你好,男生和女生之間還有差別,男生寫法是:สวัสดีครับ,女生則是:สวัสดีค่ะ性能

不過這並不重要,重要的是,咱們發現某些字的上面,還帶了特殊的符號。就好像是戴上了帽子。
事實上,泰文字符不只會「戴帽子」,偶爾還會「穿鞋子」。
好比下面三個字符:ผ ผู ผู้字體

若是腦洞再大一點,有人就會想,那是否是還能夠戴多頂帽子呢?
的確如此…泰文容許你穿一雙鞋子,而且戴兩頂帽子。完整的形式是這樣的:
編碼

因此,平時看慣了中英文的咱們,須要改變一下思路了。
世界上的文字,並不全是規規整整橫向排列的格子,也存在像泰文這種變形金剛組合式的文字。設計

雖然標準的泰文裏,「帽子」和「鞋子」的數量是有限制的,但因爲國際碼的迷之設計(先賣個關子),在計算機裏顯示的泰文字符,卻能夠擁有無數的帽子和鞋子。也就是說,它變成了一款能夠在Y軸無限拓展的文字!3d

而且,咱不光能夠往上噴,還能夠有必定角度…

還能夠

,簡直是不講道理。

(因爲一些系統會崩潰,這裏使用截圖)

2、人與機器的矛盾

而後咱們會質問Unicode,你爲什麼不講道理?
如此的設計,近乎是一個bug;但即便是bug,也應該早就修復了呀。

事實上,這樣的設計,是爲了解決一個問題:人與機器的矛盾。

首先是存儲的矛盾。
若是把每一個組合好的泰文用一個編碼來表示,那麼至少須要44×21×4=3696個編碼(實際上可能要比這還多)。用如此多的編碼來處理基本元素只有69個的文字是很是浪費的,所以電腦採用一套稱爲複雜文字編排(CTL)的設計來解決矛盾。
簡單的說,泰文的每一個基本字符對應一個編碼,用戶在輸入法裏依次輸入多個基本字符進行拼合,最後敲一個特殊的「結束字符」;這時前面輸入的基本字符,就拼合成了一個單獨的泰文字符,在屏幕中顯示。 這樣就解決了存儲的空間浪費問題。

但這樣就帶來了第二個矛盾,識別的問題。
人能夠輕鬆地識別一個泰文合字是否拼寫正確、有意義;但機器在顯示時卻很難進行判斷,即便能夠也會帶來相應的性能問題。
如何解決呢?現在會在輸入法上作一些文章,好比打一個聲調符號後就不能再輸入了。不過,因爲泰文這種基於結束標誌合成字符的本質,你仍是無法避免「藝術家」們使用複製粘貼、手工撰改字符位置等方式去進行創造,只能起到一些限制做用。

其次,在比較新版本的Webkit裏,在顯示上會阻止這種往上下冒的字符,這樣至少不影響排版。因此有部分字符已經不會出現上下疊加的情形了,你能夠在不一樣瀏覽器,觀察一下這個字符的顯示:ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็

3、萌即正義的顏文字 (ง •̀_•́)ง

也許你以爲泰文奇葩,但它的聲調就在文字裏,看到就能準確地讀出來。這樣更容易傳播,是否是也沒了你讀文言文要查字典的煩惱呢?因此文字的設計各有優劣。

這樣的設計不止泰文,它只是一個典型的例子。除此以外常見的還有老撾文、藏文。
腦洞大開的藝術家們,又會想到另一個好玩的事情:我能不能拿老撾文的「帽子」,組合「藏文」的鞋子,合成一個獨立的字符呢?

他們贏了。不久,顏文字開始流行。

好比,這個表情:(;´༎ຶД༎ຶ`)
裏面有眼睛流淚的一個字符:༎ຶ
它是什麼語言呢?

事實上,它並不屬於世界上任何一種語言!眼睛部分是老撾文,淚水部分屬於藏文
可是,你在複製它的時候,能夠發現它倒是一個單獨的字符,這就很是的神奇。緣由咱們在第二部分已經講過了。

我是如何知道的呢?固然我並非個語言學家,咱們能夠轉碼一下,發現༎ຶ對應的編碼是\u0f0e\u0eb6,再到 unicode-table 裏去查看就清楚了。

除此以外——

  • ▷ˋε´◁ 中 ε 是希臘字母
  • ʕ-'ᴥ’-ʔ 中 ʕᴥʔ 是國際音標
  • (·ཀ·」∠) 中 ཀ 是藏文
  • (ง •̀_•́ )ง 中 ง 是泰文
  • 罒 д 罒 中 罒 是中文(同網),д 是俄語西裏爾字母

看來若是你會發顏文字,就是名副其實的會「十八國語言」了呢 (๑✦ˑ̫✦)✧

4、字體的錯位

前面咱們一直在談字符的本質,但字符在屏幕中的展現,還有一個關鍵的因素:字體。
相同的字符,使用了不一樣的字體,它們的顯示也會有差異。

一行中文,你設置「黑體」或「草書」,它大致來看仍是規整的;
但若是你設置一行英文爲「草書」,可能就會有問題。

在瀏覽器裏,若是對應編碼在字體文件裏爲空,通常會展現成一個方格,起碼不會影響其餘正常字符的排版。但咱們知道,Unicode的林子實在太大了…
在某些字體裏,就會對一些特殊的字符產生錯誤的排版。

好比:熱҈的҈字҈都҈出҈汗҈了҈

把它轉義一下,就獲得編碼是: \u70ed\u0488\u7684\u0488\u5b57\u0488\u90fd\u0488\u51fa\u0488\u6c57\u0488\u4e86\u0488

其中0488就是҈這個字符的編碼,它是一個組合用的西里爾文百千符號

它在大部分經常使用字體裏,都有錯位問題;而其餘一些字體,好比 Courier New 字體,則是分開的展現:

那麼,這兩種展現哪一種纔是正常的呢?其實都不正常。
咱們查看西里爾文計數法的wiki,能夠看到它只有配合西里爾數字時,才能展現正常:

至於你把它跟其餘語言組合在一塊兒時,咱們要麼看到錯位,要麼看到分離的展現。並且國際上並無一個組織,去規定要怎麼展現。事實上文字這麼多,根本也管不過來,因此這也是混亂的緣由。

最後補充一點,另一小撮別有心裁的藝術家,還習慣使用這個字符去突破敏感詞過濾…

5、混亂與創新?

值得一提的是,Unicode是不可阻擋的潮流,它也一直在更新。好比咱們經常使用的Emoji表情,就已是Unicode的標準字符集。

而前面咱們說到,你們在玩這些奇奇怪怪的字符時,都是基於「相似bug」的設定在搞事情。這就有很大的侷限性。
那「藝術家」們又會有些大膽的想法:我能不能主動創造一些新字符,就是爲了錯位和組合呢?

我也不清楚這是創新,仍是會帶來更多的混亂。但事實是,iOS系統自帶的字符,已經有這樣的嘗試了。而且搜狗輸入法在iOS系統提供的諸多符號裏,挑選了一些,可供用戶去使用。這個功能的名字,叫作花漾字。

仍是得感慨藝術家們的視角是多麼獨特。
既然都這樣了…最後,但願咱們的國產表情包能有朝一日打入Unicode吧。

(未完待續)

相關文章
相關標籤/搜索