[心得] UNICODE
寫嵌入式軟體,離人類世界遙遠,我只知道英文字ASCII code是1byte
小時候用倚天中文,BIG5編碼每個字2byte
UNICODE似乎是2byte,可以表示全世界的文字,矇矇懂懂
閱讀Joel On Software的第四章
https://www.books.com.tw/products/0010467041
這篇文章也可以在這裡看到
https://www.cnblogs.com/AlphaAI/articles/3960296.html
----
原來UNICODE有個Code Point的概念
制定(橋)出這張code point的前輩,真的是偉大的成就
人類終於有一個共同的表示法,紀錄每個字
所以用BIG5編碼的文件,可以讀入以後,"DECODE"成上述的編碼(我覺得是UCS2)
在wchar_t的domain (u16)做字串處理
最後儲存的時候,再"ENCODE"成其他格式,例如UTF-8
之前用Python的UNICODE感覺encode/decode難以理解
現在總算搞懂UTF-8是什麼,整理一份note記下來
https://lihgong.blogspot.com/2023/11/utf-8-unicode-utf-32-big5.html
----
patch, thanks to ybite, 更新UTF16 surrogate pair的資訊
這東西的概念是這樣
1. UNICODE 0xD800 ~ 0xDFFF大家講好不放東西;所以出現這種字元必定有詐!
一般狀態是 2byte代表一個字,這種狀態變成4byte代表一個字
很多地方都有類似的招數
2. 要把UNICODE的U+10000 ~ U+10FFFF編進去,先把數值扣掉0x10000
看看他在16bit定址範圍外的offset多少,這裡的值域是0xFFFFF, 20bit
3. 編碼規則如下
byte0 = offset[19:10] + 0xD800
byte1 = offset[9:0] + 0xDC00
4. 這種編碼結構好處是self-synchronization,因為開頭和結尾的值域固定下來了
如果中間有小錯誤也能偵測出來
缺點就LIB解析時,還有些額外的邏輯要弄,還真的有點麻煩;
不過比起用4byte字串的記憶體開銷相比,應該勉勉強強能接受;
反正現在電腦效能過剩,小事啦!
--
熱心推
推
有料分享就推
推 當初直覺該encode怎麼叫作decode 傻了一陣子 ORZ
推推推
推
Unicode 目前已經快破15萬字 無法塞進2byte了
因此UTF-16定義Surrogate Pair來解決(一個字32bit)
Python 2的時候str是ASCII 後來新增了unicode 型態
Python 3 其中一個大改就是str 一定是一串Unicode文字
(unicode扶正str)需要轉成特定編碼再.encode('utf-8')
encode出來的是bytes
然後傳統編碼 如big5 就是要建一張大表對應Unicode
也由於各種歷史原因 其實這個對應並沒有很完全做到1:1
如PTT的Big5日文 後來很長時間是用由but維護的「社群標準」
Unicode補完計畫來當對應表
直到後來PTT內建UTF-8編碼輸出模式後才解決很多問題
每個語言或每個作業系統都有自己內部存Unicode的規格
Python是PyUnicodeObject(PEP-393)
我還記得當年Python 2處理編碼真的是地獄
Unicode補完計畫最早是直接patch Windows 的cp950對應表
後來UTF-8變成壓倒性主流後 剩下PTT內部資料轉換的情境了
樓上好猛
喔
感謝*ybite,我把Surrogate Pair資訊也補上
啊不過同一個漢字不同寫法用同一個 code point 問題無解
然後難的地方在複雜語系一堆規則。
放棄UTF-16吧,投入可變字串長度UTF-8的世界
好文,學習了
推
再看完這兩篇就打通任督二脈了
優質文,推推
1
感謝分享
你應該是寫MCU之類的吧,Embedded Linux也是會碰Unicode
27
[問卦] 目前PTT支援的表情符號☺因為系統好像是BIG5編碼儲存剛好和unicode 1.1版的emoji 編碼有對上 所以PTT目前只支援 ‼ ↕ ☁13
[問卦] 為什麼PTT還是不能打中英文以外的文字例如阿拉伯文和韓文 現在都已經是Unicode字碼時代了 PTT還停留在big5時代嗎 有沒有PTT不能打中英文以外文字的八卦 --20
[問題] 車機顯示不出部分中文字其實不確定這個問題該不該發在車板,硬著頭皮來看看這邊能否找到解答。 車子是kia的ceed sw,原廠車機,在播放某些歌曲時的某些中文字會顯示不出來,如圖所示 。11
Re: [問卦] 兩天內,如何惡補使用C語言開發MCU?... : 能如何惡補使用C語言開發MCU? : 拯救學弟面臨的困境. : 想問各位高手有解決方法嗎? : 有掛嗎?6
[心得][英文] 一定要寫英文嗎?上次談了《如何命名「數量變數」?》,收到很多迴響,其中一個最常見的問題是 :「寫程式一定要用英文嗎?」今天就來談談這個題目。 * Google 簡報: * Google 簡報原始檔: * Facebook 相簿:6
Re: [閒聊] 起點網站部分文字無法轉繁體顯示 伴隨着 字碼 伴隨#58016 58016轉16進位是E2A0 Unicode碼裡E000~EFFF是私人造字區 也就是大家遵守的規範裡沒定義3
Re: [新聞] 新生寶寶「取名莯」報戶口被打槍!他嘆很多人都說手機打的出來 啊就big5跟utf8的差異而已啊 繁體中文有很多編碼歷史就不講了 utf8的字遠多於big 但就windows電腦繁中還是BIG53
Re: [問題]win10新文字文件如何顯示日文?日文文字檔有三種狀況 1. 原生文字檔 Shift-JIS 這類 DBCS 格式 2. Big5 + 垃圾補完計畫 的 DBCS 格式 3. Unicode (含UTF) 的萬國通用格式 你是在問哪一種狀況? 搞清楚再來問,3
Re: [警世] 網遊取名要謹慎我很好奇 如果有上古網遊不支援unicode 硬是創了個非big5的id 例如日文 在其他人眼裡會是空白id人 例如魔力寶貝 這樣就是薛丁格的id- 每當從「愛下電子書」,「小強文學網」,「知軒藏書」...等網站下載文字檔時。會出現 框框:無法打開文件。文字編碼「Unicode (顯示方式/文字編碼/中文(GB18030 ) ) 」 這在以前,解決方式就是直接把檔案拉進Chrome開啟,全選,copy,貼新文字檔。 但最近Chrome只要開1M以上檔案時,就潰。 只好回頭研究用Safari來解決。