((??? ?????? ??)???)這種一堆符號擠在一起的組合是如何打出來的?

((??? ?????? ??)???)我是小叮噹 ??˙???????˙????ˉ?????我是大雄 ?????????????????????????我是靜香 (??????? ?? ?????我是胖虎 ?????ˋ?????ˊ?????????我是小夫。這裡排版上有點亂,但也基本可以看出個大概,具體見下圖。
第一個圖在網易跟帖看到的原始貼。
第二個圖我嘗試複製到微博里,發布出來在手機上顯示的效果。但是與原貼略有不同,尤其是大雄和靜香。
第三個圖是同一條微博在電腦上的顯示,更加糟糕了。

問題就是:1. 如不用專門軟體,這種一堆符號擠在一起的組合是如何打出來的。2. 為什麼在不同的場合下顯示不同,原理是什麼。


拿 ((??? ?????? ??)???) 舉例子吧。

首先我們看看這一坨符號有多長。

答:20個字元。

然後一個一個看這些字元是什麼就可以了。

有幾個比較好認。比如左小括弧"(",右小括弧")",還有空格" "。

剩下的字元我們來看看它們的Unicode碼。

前面兩個都是左小括弧(U+28):(

第3個符號(U+335)叫Combining Short Stroke Overlay(組合短連字元),效果是上個字元和這個字元之間會出現一個不佔空間的短橫線。舉個例子:a?b。

第4個符號(U+301)叫Combining Acute Accent(組合尖音符),用於標某些字元的重音用。顯示效果是在它前面一個字母的頂上出現一個聲調符號。使用方式如下:X?

第5個符號又是U+335。

然後是U+20,空格。

第7個符號是U+306,Combining Breve(組合短音符),開口向上的半圓弧,標在上個字母的上方,表示短母音用:U?。

第8個符號是U+352,Combining Fermata(組合延音符),是用在五線譜記譜的一個特殊符號,標在上一個字母的上方,表示該音符延長發聲。形狀就像一個半圓弧中間一個圓點:B?。

第9個符號是U+35F,Combining Double Macron Below(組合雙下長音符),就是兩倍長的普通長音符,形狀就像兩倍長的下劃線:U?E。

第10個符號是U+2DA,Ring Above(上圓圈)(這個:? 注意這不是一個組合字元,所以這個字元會獨佔一個字元的空間,而前面的那些組合xxx字元都是不佔空間的。)

第11個符號是U+329,Combining Vertical Line Below(組合下垂直線),上一個字母下部附加上的一個短豎線:O?。

第12個符號是U+32D,Combining Circumflex Accent Below(組合下揚抑符),在上一個字母下部附上一個^形狀的符號:E?。

第13個符號U+20,空格。
第14個符號U+306,開口向上的半圓弧(不佔空間)。
第15個符號U+352,一個半圓弧中間一個圓點(不佔空間)。
第16個符號U+29,)
第17個符號U+335,在前一個符號上附著一個連字元。

第18個符號U+300,Combining Grave Accent(組合重音符),在上一個字母上面出現一個`符號,方向剛好和前面的U+301相反:X?。

然後又是一個U+335,又來一個連字元。
最後是U+29,最後一個右小括弧完成。

分析完畢。

顯示最準的是你微博iPhone上顯示的那張圖。

我們再來對照這個圖看一遍估計就能看懂了。
首先這一堆字元裡面有普通字元(佔一個字元空間)和組合字元(附著在前一個字元之上)。
一共7個普通字元:(( ° ))
兩個左小括弧、空格、上圓圈、空格、兩個右小括弧。
然後我們來看每個普通字元上都附著了哪些組合字元。

第一個左小括弧,沒有附著組合字元。

第二個左小括弧,附著了U+335,U+301,U+335。於是在這個小括弧上面會出現一個尖音符號(很像拼音的二聲的那個符號),並且還有兩個短橫線。

然後是空格,這個空格上附著的組合字元是:U+306、U+352(分別是下圓弧和延音記號,組成了一隻眼睛。)、U+35F(最下面那條線)

上圓圈,這個符號後面附著了兩個字元:U+329、U+32D,就是那個圓圈下面的豎線和尖號。

又一個空格,附加了U+306和U+352,組成另一個眼睛。

然後是右小括弧,上面附加了U+335、U+300、U+335,組成那個小括弧上兩條橫線和上面的聲調符號。

最後一個沒有附加字元的右小括弧結束。

下面開始回答題主問題。

怎麼打出來?

答:複製。
題主肯定會追問,去哪複製?
答:Unicode?? character table,找到你要的Unicode字元點複製即可。

為什麼在不同的場合下顯示不同,原理是什麼?

答:每種字體對Unicode各種字元的支持都不一樣,不同的渲染環境對各種字元的支持也不一樣。
Unicode說到底只是制定了一個字符集,告訴大家世界上所有的字元並給它們編了號,不是每個環境都能完全支持Unicode中的每一個字元的。
還有不同的渲染環境對於同一個字元,尤其是這種無寬度的組合字元的渲染策略不同。
比如在同一個位置上出現的兩條組合連字元,有些系統就會渲染到一起,看起來是一條線,而有些系統就會在軸上區別高度渲染,你就能看到兩條線。


A~E

(. ) ( .)

( . )( . )

( . )( . )

( 。)( 。)

( 。 )( 。)

(●––●)

再看大白有點怪。


⊙ ⊙


題主,你能告訴我下面四張圖都是藉由什麼渠道做出來的么?
第一張:

第二張:

第三張:

第四張:

你當然不知道,哈哈哈哈哈哈哈哈哈哈哈。

  • 第一張,Pango(HarfBuzz)
  • 第二張,m17n(libotf)
  • 第三張,DirectWrite
  • 第四張,CoreText

本題中提及Unicode中那些帶有語義的符號的答案,都是XX。這是因為這些字元除了帶有複雜的語義之外,還有更為複雜的東西:Layout Engine。

搞前端的接觸瀏覽器比較多的,也會提到Layout Engine的,但是這上面的Layout Engine是指繪製元素盒子的概念。而對於文本而言,一個Layout Engine指的是通過輸入和系統字體相關聯,對字元是否合併以及調序進行處理。我提到的這些,是四個Layout Engine,其中最為特殊的是第四個,它支持更為複雜的AAT字體。實際上,我們可以在任何一個Layout Engine中拼出有特定意義的字元。但這種字元串的行為是不可跨平台的。想要跨平台啊,第一要相關的字體齊備,第二是要底層Layout Engine一致,第三是運行時所配置的參數一致。

題主你省省吧,知道這些事平台相關的就好。想去了解更詳細的內容?我不建議你去看相關的文檔:因為你看不完。就算是你看了你也找不到給你解答疑惑的人。


起主要作用的這種字元叫組合字元(Combining character),一般被用來注音。

怎麼打出來?

不是所有字元都能用輸入法打出來的,除非輸入法支持輸入unicode。

為什麼在不同的場合下顯示不同,原理是什麼?

難道題主沒有注意到,其他地方的文字在不同場合顯示也不同嗎?當然除了字體不同的原因,渲染引擎的支持程度也可能有影響。具體細節不太了解。


推薦閱讀:

Arial Unicode MS 的中文用的是什麼字體?
為什麼很多人不使用 Word 中的自動編號功能?
中國大陸地區真的存在紙質出版物不得採用豎排的禁令嗎?
《知日ZHIJP》的排版設計與日式排版設計的差距在哪兒?
有哪些手抄報讓你驚艷無比?

TAG:輸入法 | 排版 | 符號 | 特殊字元 |