PTT推薦

[心得] UNICODE

看板Soft_Job標題[心得] UNICODE作者
lihgong
( )
時間推噓15 推:15 噓:0 →:22

寫嵌入式軟體,離人類世界遙遠,我只知道英文字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字串的記憶體開銷相比,應該勉勉強強能接受;
反正現在電腦效能過剩,小事啦!

--

※ PTT留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.220.100.151 (臺灣)
PTT 網址

wsad5023211/06 16:42熱心推

now9911/06 23:40

wuyiulin11/06 23:41有料分享就推

saladim11/07 02:21推 當初直覺該encode怎麼叫作decode 傻了一陣子 ORZ

geoege02270211/07 11:40推推推

ToastBen11/07 15:49

ybite11/07 17:32Unicode 目前已經快破15萬字 無法塞進2byte了

ybite11/07 17:41因此UTF-16定義Surrogate Pair來解決(一個字32bit)

ybite11/07 17:48Python 2的時候str是ASCII 後來新增了unicode 型態

ybite11/07 17:48Python 3 其中一個大改就是str 一定是一串Unicode文字

ybite11/07 17:49(unicode扶正str)需要轉成特定編碼再.encode('utf-8')

ybite11/07 17:50encode出來的是bytes

ybite11/07 17:52然後傳統編碼 如big5 就是要建一張大表對應Unicode

ybite11/07 17:52也由於各種歷史原因 其實這個對應並沒有很完全做到1:1

ybite11/07 17:55如PTT的Big5日文 後來很長時間是用由but維護的「社群標準」

ybite11/07 17:55Unicode補完計畫來當對應表

ybite11/07 17:56直到後來PTT內建UTF-8編碼輸出模式後才解決很多問題

ybite11/07 17:57每個語言或每個作業系統都有自己內部存Unicode的規格

ybite11/07 18:02Python是PyUnicodeObject(PEP-393)

ybite11/07 18:03我還記得當年Python 2處理編碼真的是地獄

ybite11/07 18:09Unicode補完計畫最早是直接patch Windows 的cp950對應表

ybite11/07 18:09後來UTF-8變成壓倒性主流後 剩下PTT內部資料轉換的情境了

MoonCode11/07 22:12樓上好猛

superpandal11/07 23:04

※ 編輯: lihgong (122.116.164.102 臺灣), 11/07/2023 23:18:41

lihgong11/07 23:19感謝*ybite,我把Surrogate Pair資訊也補上

Bencrie11/07 23:41啊不過同一個漢字不同寫法用同一個 code point 問題無解

Bencrie11/07 23:45然後難的地方在複雜語系一堆規則。

labbat11/07 23:53放棄UTF-16吧,投入可變字串長度UTF-8的世界

zzLin11/08 00:21好文,學習了

eopXD11/08 05:13

Dracarys11/08 09:13再看完這兩篇就打通任督二脈了

Dracarys11/08 09:13https://tonsky.me/blog/emoji/

Dracarys11/08 09:13https://tonsky.me/blog/unicode/

jheli11/08 09:28優質文,推推

Mtcat11/08 14:401

yuinami11/08 22:33感謝分享

askacis11/09 11:21你應該是寫MCU之類的吧,Embedded Linux也是會碰Unicode