關於Unicode,utf-8,utf-16 on mac

Unicode

說到Unicode的起源就要先談起ASCII。
ASCII使用一個字節(8位)進行存儲,8位一共可以表示256個字符,而ASCII只使用了其中的128位,即0~127位,這128位裏面包括了常用的英文字符以及標點符號。
現在雖然解決了英語的表示問題,但還有一些語言不使用英語的字符表示,因此它們使用剩下的128位進行表示,即128~256位,後面的128位也被稱爲擴展字符集。
對於亞洲的一些國家,如中國的漢字用256位也無法表示完整,因此會採用兩個字節進行存儲表示,一開始的時候要求兩個字節都需要大於127來表示一個漢字,這時的漢字編碼方案被稱爲GB2312。然而很快用兩個字節也不夠存儲漢字,因此允許只需要第一個字節大於127即可表示一個漢字,擴展後的這種漢字方案就是GBK標準。
OK,不同語言的編碼方案似乎已經確定下來了,但還有一個問題:
不同語言的編碼方案不一樣,那不同國家之間如何通過ASCII進行交流?
因此,人們希望通過unicode實現所有文字的統一編碼,每一個文字都有獨一無二的unicode碼。
unicode使用四個字節(兩個十六進制表示一個字節)來存儲文字的。
比如常見的U+表示法

'U+00000024' -> 'U+0024' -> '$'
'U+0001F604' -> 'U+1F604' -> '��'

(似乎CSDN markdown不支持emoji,只能用:smile:來代替U+1F604顯示的emoji表情)
當使用兩個字節的時候,unicode所處的平面也就是BMP平面,包含了基本的文字符號。
可能平時常見的是轉義字符的unicode,如\U,\u,\x。
\U後面接8位十六進制, 不足八位的時候根據使用環境看是否可以省略前面的0,\u接4位十六進制,\x接2位十六進制。
但是unicode自身也存在許多問題:
1. 如何判定這是一個unicode碼還是一個ascii碼?換言之,如何判定四個字節表示一個符號還是四個符號?
2. 在表示傳統字節的時候,如ASCII部分的時候,正常來說只需要一個字節,而用unicode進行表示的時候,前三個字節都必須爲0,這就造成了空間的極大浪費。
參考資料:Unicode 維基百科

UTF-8

由於以上unicode的問題,一開始unicode的推廣受到了阻塞。
但是人們想到可以通過對Unicode進行一種變長的編碼方式進行存儲,這就是UTF-8。(UTF-8也是一種前綴碼,比如哈夫曼編碼)

轉換規則

在ASCII碼的範圍,用一個字節表示,超出ASCII碼的範圍就用字節表示,這就形成了我們上面看到的UTF-8的表示方法,這様的好處是當UNICODE文件中只有ASCII碼時,存儲的文件都爲一個字節,所以就是普通的ASCII文件無異,讀取的時候也是如此,所以能與以前的ASCII文件兼容。

大於ASCII碼的,就會由上面的第一字節的前幾位表示該unicode字符的長度,比如110xxxxx前三位的二進制表示告訴我們這是個2BYTE的UNICODE字符;1110xxxx是個三位的UNICODE字符,依此類推;xxx的位置由字符編碼數的二進制表示的位填入。越靠右的x具有越少的特殊意義。只用最短的那個足夠表達一個字符編碼數的多字節串。注意在多字節串中,第一個字節的開頭”1”的數目就是整個串中字節的數目。

ASCII字母繼續使用1字節存儲,重音文字、希臘字母或西裏爾字母等使用2字節來存儲,而常用的漢字就要使用3字節。輔助平面字符則使用4字節。

在UTF-8文件的開首,很多時都放置一個U+FEFF字符(UTF-8以EF,BB,BF代表),以顯示這個文本文件是以UTF-8編碼。

unicode to utf-8 example from 維基百科
值得注意的是,utf-8的一個字節表示跟ASCII碼是相同的。

UTF-16

跟UTF-8相似,UTF-16也是一種unicode的編碼實現方式,主要的區別是轉換規則的不同。
unicode to utf-16 example from 維基百科
utf-16兩字節的表示方式跟unicode是相同的,但卻無法跟ASCII碼兼容。

實例:在mac上通過unicode編碼輸出emoji表情

way 1

說個不切題的方法,在mac上面只要通過快捷鍵Ctrl+Command+space就能快速調用emoji表情列表直接輸入。(下面步入正題)

way 2

直接在終端通過echo命令打印unicode編碼,由於CSDN markdown不支持emoji,所以截圖:
mac echo emoji

way 3

如果我想要在mac上直接輸入unicode碼,那就要開啓mac的Unicode Hex Input了。
打開Preference裏面的keyboard,點擊input source然後將Unicode Hex Input加入(善用搜索功能)。
接着在終端上按住option鍵的同時輸入四位的unicode碼,終端上就會顯示對應的符號了。參考stack overflow鏈接:how do you echo a 4 digit unicode character in bash
OK,四位的unicode碼的鍵盤輸入解決了,但如果我想輸入不只兩個字節的unicode碼呢?
首先,要對mac的Unicode Hex Input有一個認識,即它的輸入是按照UTF-16進行編碼的。
一開始的時候輸入四位unicode碼能正常輸出正是因爲UTF-16兩個字節的表示跟Unicode是完全相同的,因此,如果,我們想要輸出emoji表情,必須先把emoji的unicode碼轉換成UTF-16再通過option輸出。
例子參考這個鏈接:How can I type unicode characters without using the mouse?
但是,不建議在終端上進行顯示,因爲終端顯示的編碼方式默認是UTF-8,因此通過UTF-16顯示的emoji不會在終端上顯示。(隨便找個輸入框進行測試)
通過locale命令可以讀取當前的語系並進行export 修改。

way 4

最後,我想在vim裏面輸入emoji呢?
vim同樣提供了對emoji的支持,可以先在一般模式下輸入:help unicode查看幫助文件,依次按下Ctrl+V u進入unicode的輸入模式。
參考鏈接:how-to-insert-unicode-characters-in-vim

發佈了51 篇原創文章 · 獲贊 22 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章