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

工程師一定要懂的 Text Encoding

Inndy
December 18, 2020

工程師一定要懂的 Text Encoding

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]

    View full-size slide

  2. 奧義智慧 Proprietary and Confidential Information
    電腦如何儲存文字?

    View full-size slide

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

    View full-size slide

  4. 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

    View full-size slide

  5. 奧義智慧 Proprietary and Confidential Information
    歐洲人怎麼辦?

    View full-size slide

  6. 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")

    View full-size slide

  7. 奧義智慧 Proprietary and Confidential Information
    亞洲人怎麼辦?

    View full-size slide

  8. 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"

    View full-size slide

  9. 奧義智慧 Proprietary and Confidential Information
    同一份文件要放
    兩種語言要怎麼辦?

    View full-size slide

  10. 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

    View full-size slide

  11. 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

    View full-size slide

  12. 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'

    View full-size slide

  13. 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

    View full-size slide

  14. Creative Commons 3.0 BY-NC-ND
    Unicode - Surrogate Pairs

    View full-size slide

  15. 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

    View full-size slide

  16. 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

    View full-size slide

  17. Creative Commons 3.0 BY-NC-ND
    延伸閱讀
    ► https://www.ptt.cc/bbs/Python/M.1467340705.A.2F5.html
    ► https://docs.python.org/3.5/library/codecs.html#standard-encodings

    View full-size slide