您當前的位置:首頁 > 收藏

unicode字元詳解(四)~有趣的數字

作者:由 人工智慧 曾 發表于 收藏時間:2022-09-08

接前面的

人工智慧 曾:unicode字元詳解(三)

8。 Unicode中的數字

表示數的字元叫做數字,數字恐怕是最常見的字元。最通用的數字是阿拉伯印度數字,另外還有比較少用的愛琴海數字(古希臘的城邦用),羅馬數字,中國的算籌數字,楔形數字和古希臘數字。

1) 阿拉伯-印度數字

阿拉伯-印度數字都得到了廣泛應用,在世界範圍內其語義都是明確一致的。然而不同的書寫系統所用的符號卻又不同。比如:

unicode字元詳解(四)~有趣的數字

實際上,還有另外的符號表示阿拉伯數字,比如烏爾都語和阿拉伯地區用於鐘錶的阿拉伯數字等等。不同文明的書寫體系中這些數字會有相應的變體。

這些計數用的(1~9)符號,在公元3世紀由古印度數學家巴格達創造出來,幾百年後的笈多王朝時期,印度學者又創造了數字‘0’。

公元700年前後,阿拉伯帝國征服了印度的旁遮普地區,善於計算的阿拉伯人發現印度的數學居然比他們先進很多,於是採用了這些計數符號。

由於當時阿拉伯帝國龐大的疆域橫跨了亞歐,這些數學知識也很快傳播到了屬地西班牙,公元12世紀,歐洲的學者正式採用了這些數字。由於是由阿拉伯人傳給他們的,他們便誤以為是阿拉伯人發明的,所以就把這些數字稱作阿拉伯數字。

通常,我們說的阿拉伯數字,指的就是西阿拉伯-印度數字,包含十個數字0~9。它們和小數點結合起來可以組成任意的有理數。Unicode把這十個數字(0~9)放在歐洲風格的基本拉丁塊中。

數字符號除了計數以外,它的數值特性還可以用於文字的編輯,使文章更有條理,比如這篇文章的⑴、⑵、①、②等。

2) 十進位制小數

比如‘0。25’。Unicode沒有通用的小數分隔符,很多書寫系統常常借用標點符號來實現。例如,在美國用句號(U+002E),也有好多地方是用逗號表示的:

1,234,567。89(中國,美國)

1。234。567,89(西班牙)

而阿拉伯文字則有自己專用的小數分隔符”,”,就象一個逗號,它的碼點是(U+066B),比如0。25寫為:

儘管阿拉伯文從右向左書寫,但十進位制小數的含義卻是一樣的,最高位在左,最低位在右。

3)

漢字數字

⑴ 中國的算籌與花碼數字

我們的祖先有創造和使用工具的驚人天賦。為了解決計算上的難題,他們很早就使用隨手可取的小木棍來幫助運算,這些代表數字的小木棍就叫算籌。大批次制式的算籌是用竹子製作的。講究的人甚至用玉或象牙來製作。由於算籌的歷史太過悠久,我們已經無法知道它是何時發明的。但我們知道老子、孔子時代已經用算籌來教學生計算了。

unicode字元詳解(四)~有趣的數字

算籌計數Counting-rod numerals

unicode字元詳解(四)~有趣的數字

最早,並沒有‘0’,而無或沒有的概念是用一個空位表示的。

如何用這些符號來表示一個數呢?《孫子算經》中有押韻的順口溜:

“凡算之法,先識其位,一縱十橫,百立千僵,千十相望,萬百相當。”

前兩句強調了位在記數中的意義,後四句則指明瞭擺放算籌時的一般規則:個位數用縱式,十位數用橫式,百位用縱式,千位用橫式,萬位用縱式,依此類推,交替使用縱橫兩式。《孫子算經》年代與作者不詳,但合理的推測是南北朝時代,或許是春秋戰國時代,在南北朝時代做了全面的整理修正。它的內容龐雜,涉及加減乘除、面積、體積、邏輯推理等各種問題。

這種記數方法,採用了“十進位制”,用空位來代替“0”。遇到空位,算籌記法的解決方式是不放算籌,因為記數時算籌是縱橫相間,因此空檔是易於辨認的,這就在一定程度上避免了可能出現的混淆。當然,在面對連續空位較多,或者末位有多個零的情況時,這種記數法仍存在著不足。

比如 86021,可以用算籌擺為:

unicode字元詳解(四)~有趣的數字

算籌因為不能記憶前面步驟的結果,因而容易出錯,另外這種運算太佔地方。不過,對於心算厲害的人,甚至可以不用算籌,《老子》中就曾有“善數者不用籌策”的說法。

當然,這難不倒祖先們,在東漢末年,我們的祖先又發明了一個更偉大的運算工具算盤。算盤方便得不可思議,不會識文斷字卻會使用算盤的大有人在,在近二千年的歷史長河中,算盤是中國一個家庭的標配,即便到現在,它仍然有使用的價值。

花碼數字

花碼數字又稱蘇州碼(Unicode舊版誤記為杭州碼),番仔碼或草碼,源於蘇州。現在這種數字在中國大陸及臺灣幾近絕跡,但在港澳地區的街市、舊式茶餐廳及中藥房偶而可見。香港公共小型巴士曾以此標示車資價錢。香港小學數學課程中將之稱為中國古代數字,並於小學六年級教授有關用法(在寫此書時,有朋友說廣州沙面的街鋪也有這種選單)。

unicode字元詳解(四)~有趣的數字

花碼在南宋時期由算籌演變而來。同算籌一樣,花碼是一種十進位制計數系統。花碼通常用在商業領域裡,主要用途是速記。花碼在民間流行了數百年後,最終在20世紀初被阿拉伯數字取代。

其實,阿拉伯數字大約在13世紀時就傳入中國,但由於中國已經有了算籌和花碼,阿拉伯數字就沒有在那時流行起來。花碼及相應的unicode編碼如下:

def f(m,n):

for i in range(m,n+1):

print(chr(i),end=‘’)

f(0x3021,0x3029) # 蘇州花碼1-9

print()

f(0X3038,0X303a) # 蘇州花碼10,20,30

執行結果:

〡〢〣〤〥〦〧〨〩 # 蘇州花碼1-9

〸〹〺 # 蘇州花碼10,20,30

舉一個花碼計數的例子:

unicode字元詳解(四)~有趣的數字

以上第一行記載的是數目的數值,“〤〇〢二”代表4022。第二行記載數目的數量級和計量單位。此處數量級是拾(十),代表第一行的第一位數字的數量級是十位。換言之這數字是“40。22元”,或“四十元二角二分”。在香港茶餐廳會將 “ 十 ” 或 “ 百 ” 寫於底部作為最大數量級,一位數的數量級不需要記載。以上又可寫成豎排:

unicode字元詳解(四)~有趣的數字

現在,是不是可以看懂香港的菜價了?如果在廣州的沙面遊玩時,你有幸看到這些菜牌,而且更加幸運的話,邊上恰好有個妹子,當你漫不經心地說出菜價,難道不是一種很牛的裝逼方式嗎?

這些計數方式,今天雖然很少用了,但瞭解一下我們祖先的計數與演算方法,仍然感到真心的驕傲。這些數字也收錄在unicode的編碼規範中。

⑵ 中文數字

中文書寫體系的數字通常用到阿拉伯數字、簡寫和大寫中文數字。中文數字在東亞廣泛使用,所以也稱作CJK(中文、日文和韓文)數字。

unicode字元詳解(四)~有趣的數字

小結:

Unicode標準首先是收集了全世界的所有字元,按語言進行了分類,並給每一個字元一個碼點,這個碼點是一個整數,可以用十進位制或十六進位制來表示。但它並不管如何給這些字元分配記憶體,如何分配記憶體是下面UTF編碼部分要講的內容。

題外話: 聽說,華為開發了一種程式語言,用漢字來顯示,目前尚沒見到。我隱隱有些擔心,就像數字表示一樣,本來阿拉伯數字在13世紀時就傳入中國了,可我們卻因為有了自己的數字而沒有采用它。

未完待續