Bit Byte และ Characters Set

noomerZx
3 min readMay 20, 2019
credit: https://www.androidpit.com/what-is-a-bit-byte

ช่วงนี้ทำงานแล้วเจอปัญหาการส่งข้อมูลอักขระโดยกำหนดเป็น length ของจำนวน Byte เลยมีโอกาสได้ศึกษาเพิ่มเติม และคิดว่ามันน่าสนใจดีเลยจะมาเล่าสู่กันฟังเด้อ อีกทั้งใช้เวลาเยอะมากๆ เพราะข้อมูลแต่ละที่ทำสับสนไปหมดกว่าจะจับใจความและสรุปได้ก็ลากเลือด หวังว่าจะเป็นประโยชน์กับทุกๆท่านนะครับผม

Bit

Bit หรือ Binary Digit คือ “หน่วย” ข้อมูลที่เล็กที่สุดโดย 1 Bit สามารถเก็บค่าได้เพียง 1 หรือ 0 เท่านั้น

Byte

สำหรับ Byte คือ “ชุด” ของข้อมูลที่เล็กที่สุด ประกอบไปด้วย Bit จำนวน 8 Bit นั่นเอง

มาถึงจุดนี้ผมจะถามทุกๆท่านว่า… 1 ตัวอักษรนั้นเท่ากับ กี่ Bit หรือ กี่ Byte ?? ฮั่นแน่ คุ้นๆละสิ ผมมีตัวเลือกให้ 5 ข้อ และเดี๋ยวจะมาเฉลยในช่วงท้าย

  • 1 Byte ?
  • 2 Byte ?
  • 3 Byte ?
  • 4 Byte ?
  • ถูกทุกข้อ

Characters Set

ASCII CODE

credit: https://www.guimee.com/blog/242/%E0%B8%A3%E0%B8%AB%E0%B8%B1%E0%B8%AA-ascii-%E0%B9%81%E0%B8%A5%E0%B8%B0-unicode-%E0%B8%95%E0%B9%88%E0%B8%B2%E0%B8%87%E0%B8%81%E0%B8%B1%E0%B8%99%E0%B8%AD%E0%B8%A2%E0%B9%88%E0%B8%B2%E0%B8%87%E0%B9%84%E0%B8%A3/

ASCII CODE หรือตารางอักขระที่มีตัวอักษรภาษาอังกฤษและสัญลักษณ์ต่างๆทั้งหมด 127 ตัว หรือ 2⁷ และ 1 อักขระจะใช้พื้นที่ 7 Bit หรือ1 Byte เพราะมันถูกสร้างขึ้นมาเพื่อใช้งานในระบบคอมพิวเตอร์ยุคแรกๆนั่นเอง

ASCII CODE ใช้พื้นที่แค่ 7 Bit ดังนั้นยังเหลืออีก 1 Bit ที่ว่าง ทำให้ภาษาอื่นๆสามารถใช้ช่องว่างตรงนี้ได้เพราะ 1 Byte มี 8 Bit หรือ 2⁸ นั่นคือ 256 อักขระ แต่ภาษาอังกฤษและสัญลักษณ์ใน ASCII ใช้ไปเพียง 127 ตัว ดังนั้นมันยังเหลือที่ว่างอีก 129 อักขระ !!

และนั่นเป็นที่มาของ Characters Set ในภาษาอื่นๆที่อาศัยช่องว่างที่เหลือเพื่อเติมอักขระของภาษาตัวเองเข้าไป และกำหนดเป็น Characters Set ใหม่ๆอย่าง TIS620 สำหรับภาษาไทย เป็นต้น

ไม่ว่า Characters Set ใดถ้าวางอยู่บนพื้นฐานของ ASCII CODE จะทำให้อักขระในภาษานั้นใช้พื้นที่เพียง 1 Byte เท่านั้น !

แต่ !!!!!! ก็ใช่ว่าจะมีแต่ข้อดีนะครับ อย่าลืมว่า ถ้าใช้ Char Set TIS620 ของไทยเราวาง ก.ไก่ ไว้ในช่องที่ 128 และส่งข้อความไป แต่ผู้รับใช้ Char Set อื่น เมื่ออ่านข้อมูลออกมามันจะไม่ได้ ก.ไก่ นั่นเอง นั่นเป็นเหตุผลว่าทำไมเราถึงเห็นภาษาต่างดาวตามเว็บต่างๆ !! และบูมเพื่อแก้ปัญหานี้ Unicode จึงถือกำเนิดขึ้นมา

Unicode

Unicode นั้นถูกออกแบบใหม่เพื่อแก้ปัญหาข้างต่น โดยมีการแบ่งตารางออกเป็น 17 Plane รองรับอักขระกว่า 1 ล้านตัว โดยปัจจุบันมีอักขระกว่า 130k ตัวถูกวางไว้และจำแนกออกเป็น Plane ทั้งหมด 17 Plane โดย Plane ที่สำคัญที่สุดคือ Plane 0 หรือ BMP (Basic Multilingual Plane) เพราะมันจะเก็บอักขระสากลที่ถูกใช้กันทั่วโลกทั้งหมด 2¹⁶ หรือ 65,536 ตัว

โดยเมื่อพูดถึง Unicode นั้นเราจะต้องพูดถึงวิธีการเข้ารหัสต่างๆที่ตามมาบนมาตราฐานนี้ด้วยได้แก่ UTF-8, UTF-16, และ UTF-32

ใครที่เข้าใจว่า Unicode = UTF-8 นั่นไม่ใช่นะครับ ถ้าจะกล่าวให้เข้าใจในเชิง Programming ก็คือ Unicode คือ Interface ที่ UTF ต่างๆ นั้น Implement ตาม

UTF-8

ถูกออกแบบมาเพื่อให้ Backward Compatibility กับ ASCII CODE ดังนั้นอักขระทั้งหมดใน ASCII จะใช้ 1 Byte เท่าเดิม และมีค่า Binary เหมือนกันเป๊ะอีกด้วย แต่ UTF-8 สามารถกระจายตัวเองได้ทีละ 8 Bit (มากสุด 32 Bit) เพื่อรองรับภาษาอื่นๆได้ ซึ่งทำให้ UTF-8 สามารถรองรับได้ทุกภาษา โดยจะกินพื้นที่ตั้งแต่ 8–32 Bit (1–4 Byte) ต่อ 1 ตัวอักษร ปัจจุบันเป็นการเข้ารหัสที่นิยมมากที่สุด

UTF-16

จริงๆแล้วก็เหมือนกับ UTF-8 นั่นแหละแต่มีการเข้ารหัสที่แตกต่างกัน เพราะจะกระจายตัวทีละ 16 Bit (มากสุด 32 Bit) โดยทุกอักขระใน Plane 0 จะใช้พื้นที่ 16 Bit และอีก 17 Plane ที่เหลือจะใช้ 32 Bit กล่าวคือการเข้ารหัสแบบ UTF-16 นั้นจะกินพื้นที่ตั้งแต่ 16–32 Bit (2–4 Byte)

UTF-32

การเข้ารหัสแบบ UTF-32 จะรองรับ Unicode ทุกตัวโดยไม่มีเงื่อนไขใดๆ เพราะกินพื้นที่ 32 Bit หรือ 4 Byte ต่อ 1 ตัวอักขระ ปัจจุบันไม่เป็นที่นิยมมากนักเพราะค่อนข้างกินพื้นที่สูง

แล้วยังไงต่อ ??

หลายๆคนอาจจะงงว่า แล้วอย่างนั้นจะใช้ UTF-16/UTF-32 เพื่อ ? เพราะ UTF-8 น่าจะเทพที่สุดเพราะมันกระจายตัวเองได้จากหน่วยที่เล็กสุดจนถึงใหญ่สุด (8–32 Bit)

จะว่าไปมันก็ถูกครับ แต่ด้วยขั้นตอนในการเข้ารหัสต่างๆทำให้ UTF-8 จะค่อนข้างกินทรัพยากรกว่าตัวอื่นๆ เพราะตัวอื่นเพียงแค่เทียบค่ากับตาราง Unicode เฉยๆแทนที่จะต้องมี algorithm อะไรมากมายเพื่อเปรียบเทียบหรือแปลงข้อมูลไปมา

มาลองเปรียบเทียบการเข้ารหัสแบบต่างๆ กับตัวอักษร ก.ไก่ กันดีกว่าครับ

credit: https://unicode-table.com/th/0E01/

จะเห็นว่าภาษาไทยแบบ UTF-8 นั้นใช้ 24 Bit (3 Byte) แต่ถ้าเราเข้ารหัสด้วย UTF-16 จะใช้เพียง 16 Bit (2 Byte) ตะลึงตึ่งโป๊ะ !!!

แต่ถ้าจะให้แฟร์ๆ การเข้ารหัสตัวเลขหรือภาษาอังกฤษด้วย UTF-8 จะใช้เพียง 8 Bit (1 Byte) ขณะเดียวกันเจ้า UTF-16 จะใช้ 16 Bit (2 Byte) เช่นเดิมครับผม

สุดท้ายแต่ไม่ท้ายสุดก็คือ… คำตอบของคำถามที่ผมถามไว้ข้างต้น ก็คือ “ถูกทุกข้อ” ขึ้นอยู่กับว่าคุณเข้ารหัสด้วยมาตราฐานใด ทีนี้เวลาใครถามว่าภาษาไทย 1 อักขระใช้พื้นที่เท่าไหร่เราก็จะตอบได้เต็มปากแล้วนะเอ้อออออ

--

--