Upgrade to Pro — share decks privately, control downloads, hide ads and more …

工程師一定要懂的 Text Encoding

Avatar for Inndy Inndy
December 18, 2020

工程師一定要懂的 Text Encoding

Avatar for Inndy

Inndy

December 18, 2020
Tweet

More Decks by Inndy

Other Decks in Technology

Transcript

  1. Creative Commons 3.0 BY-NC-ND 工程師一定要懂的 Text Encoding 都 2 0

    2 0 了 你 還 搞 不 懂 U n i c o d e 嗎 ? Inndy Lin / [email protected]
  2. Creative Commons 3.0 BY-NC-ND ASCII 編碼 ► ASCII 定義 0x00

    ~ 0x7F ► Printable 0x20 ~ 0x7e ► ' ': 0x20 ► A: 0x41 ► a: 0x61 ► Q: 轉換大小寫快速做法 ► Ans: c ^ 0x20
  3. Creative Commons 3.0 BY-NC-ND ASCII Escape Character ► 0x00 ~

    0x1F, 0x7F ► GUI 被發明/普及以前,用 Terminal 跟 Printer ► 為什麼 Windows ( CR LF / "\r\n" ) 換行跟 Linux ( LF "\n" ) 換行不一樣? ► CR 移動遊標到行頭 ► LF 移動遊標到下一行至於為什麼 Linux 只有 LF 我就不知道了 XD
  4. Creative Commons 3.0 BY-NC-ND Latin-1 編碼 ► ASCII 定義範圍 0x00

    ~ 0x7F ► E(xtended)ASCII 0x00 ~ 0xFF ► a.k.a. ► Latin-1 ► ISO/IEC 8859-1 ► CP 437 ► Python Hack: 用 latin1 編碼可以保存任何 binary data ► b"\x01\x02\x80\xff".decode("latin1")
  5. Creative Commons 3.0 BY-NC-ND CCCII, CSIC, CISCII, …??? Big5!!! ►

    電腦發明後,臺灣自己做了幾套中文系統 ► 倚天中文系統、IBM 5550、王安碼 ► 細節我不清楚,畢竟時候我還沒出生 XD ► 資策會把廠商找來開會,指定出大五碼(五家廠商),也就是 Big5,後來也被香港採用 ► 後來 Big5 有改版,新增一些文字,Python 裡面的 Big5 是很早期的標準,所以會缺字 ► 中國自己做了 GBK ► 香港基於 Big5 做了 HKSCS ► Python Tips: 解碼中文請用 "big5-hkscs"
  6. Creative Commons 3.0 BY-NC-ND Unicode! ► 1991 年制訂了 Unicode 1.0

    ► 除了各國文字外,也包含了 Emoji ► 2020/3 Unicode 13.0 Bubble Tea Emoji! → ► Windows NT: UCS-2 ► Windows XP: UTF-16 ► UTF-8 ► ASCII 的超集合,0x00 ~ 0x7f 相容與 ASCII ► RLE (Running Length Encode) ► 中文字通常佔 3bytes ⚫ 但是 Big5, UTF16 中文只要 2bytes
  7. Creative Commons 3.0 BY-NC-ND Charset, Encoding? ► Charset 定義了有那些符號可以用(Character, Symbol)

    ► Encoding 是如何把 Character 儲存成 binary 的編碼方式 ► Big5 包含 Charset 以及 Encoding ► Unicode 是 Charset, UTF-8 是 Encoding ► UTF-16 其實有兩種,UTF-16LE, UTF-16BE ► BOM (Byte-Order Mark): 在檔案開頭放一個 U+FEFF 的 character ► PHP → Warning: Cannot modify header information – headers already sent
  8. Creative Commons 3.0 BY-NC-ND Integer Encoding ► Little Endian ►

    int a = 0x12345678; ► 在記憶體 / 檔案中: 78 56 34 12 ► UTF-16LE ► >>> chr(0x2266).encode('utf-16le').hex() ► '6622' ► >>> chr(0x2266).encode('utf-16').hex() # with BOM ► 'fffe6622'
  9. Creative Commons 3.0 BY-NC-ND Unicode 編碼黑魔法 ► Unicode 的 Code

    point 超過一個 char / wchar_t 的時候 ► UTF-8:一個中文字佔用 3 bytes,Emoji 佔用 4 bytes ► UTF-16 有時候會用 4bytes 表達一個 character
  10. Creative Commons 3.0 BY-NC-ND 延伸閱讀 ► http://utf8everywhere.org/ ← 非常推薦 ►

    https://www.meziantou.net/how-to-correctly-count-the-number-of-characters-of- a-string.htm ► https://github.com/tonsky/FiraCode ► https://speakerdeck.com/inndy/binary-processing
  11. Creative Commons 3.0 BY-NC-ND 延伸閱讀 ► https://en.wikipedia.org/wiki/Unicode ► https://en.wikipedia.org/wiki/UTF-8 ►

    https://en.wikipedia.org/wiki/UTF-16 ► https://en.wikipedia.org/wiki/Emoji ► https://en.wikipedia.org/wiki/Big5 ► https://en.wikipedia.org/wiki/Code_page_950