ASCII และ Unicode: คืออะไรและใช้ทำอะไร

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

อัปเดตเมื่อ:

การเข้ารหัสอักขระคืออะไร

การเข้ารหัสคือข้อตกลง: «เลข 65 หมายถึงตัวอักษร A» เมื่อพิมพ์ข้อความ โปรแกรมจะเก็บตัวเลขเหล่านั้น เมื่ออีกคนเปิด โปรแกรมของเขาจะแปลกลับเป็นตัวอักษรด้วยข้อตกลงเดียวกัน ถ้าสองฝ่ายไม่ใช้ตารางเดียวกัน ข้อความจะผิด

ต้องแยกสองแนวคิด อย่างแรกคือชุดอักขระ คือรายการว่าตัวเลขใดตรงกับสัญลักษณ์ใด อย่างที่สองคือวิธีเก็บตัวเลขเหล่านั้นเป็นไบต์ ใน ASCII สองอย่างนี้ตรงกันอย่างง่าย ๆ ส่วนใน Unicode ไม่ตรงกัน และตรงนี้เองที่ UTF-8 เข้ามา

ASCII: 128 อักขระแบบ 7 บิต

ASCII (ย่อมาจาก American Standard Code for Information Interchange) กำหนดเป็นมาตรฐานในทศวรรษ 1960 ใช้ 7 บิต คือ 2 ยกกำลัง 7 = 128 รหัส ตั้งแต่ 0 ถึง 127 โดย 33 รหัสเป็นอักขระควบคุม (0 ถึง 31 และ 127) และ 95 รหัสเป็นอักขระที่พิมพ์ได้ (32 ถึง 126 รวมช่องว่าง)

ไม่มีตัวอักษรที่มีเครื่องหมายกำกับ ไม่มี ñ และไม่มีสัญลักษณ์ยูโร: ออกแบบมาสำหรับภาษาอังกฤษ นี่อธิบายว่าทำไมภายหลังจึงต้องมีตารางอื่น

รหัสที่จะพบบ่อยที่สุด ช่องว่าง (32) นับเป็นอักขระที่พิมพ์ได้แม้จะมองไม่เห็น
อักขระควบคุมฐานสิบฐานสิบหกฐานสอง (7 บิต)ใช้ทำอะไร
ค่าว่าง (NUL)0000000000ระบุจุดสิ้นสุดของสตริงในหลายภาษา
แท็บแนวนอน (TAB)9090001001กระโดดไปยังตำแหน่งแท็บถัดไป
ขึ้นบรรทัดใหม่ (LF)100A0001010ลงไปบรรทัดถัดไป
กลับต้นบรรทัด (CR)130D0001101กลับไปต้นบรรทัด
หลุดออก (ESC)271B0011011เริ่มลำดับควบคุม
ช่องว่าง32200100000อักขระที่พิมพ์ได้ตัวแรก
ลบ (DEL)1277F1111111ลบอักขระ

ความสัมพันธ์ที่ควรจำ

ตารางไม่ได้เรียงแบบสุ่ม เมื่อรู้ความสม่ำเสมอไม่กี่ข้อ ก็อ่านรหัสจากความจำได้

การขึ้นบรรทัดใหม่: LF, CR และ CRLF

การขึ้นบรรทัดใหม่ดูเหมือนเรื่องง่าย แต่เขียนต่างกันไปตามระบบ Unix, Linux และ macOS ใช้อักขระเดียวคือ LF (10) ส่วน Windows ใช้สองตัวติดกัน คือ CR และ LF (13 และ 10) เรียกว่า CRLF เครื่องพิมพ์ดีดโทรเลขรุ่นเก่าต้องการคำสั่งสองอย่างที่ต่างกัน: ดึงแคร่กลับไปต้นบรรทัด และเลื่อนกระดาษขึ้นหนึ่งบรรทัด

ความต่างนี้เป็นสาเหตุที่ไฟล์ปรากฏเป็นบรรทัดเดียวในโปรแกรมแก้ไขพื้นฐาน หรือมีสัญลักษณ์แปลก ๆ ท้ายทุกบรรทัด ถ้าอยากรู้ว่าแต่ละอันมีรหัสอะไร พิมพ์ LF หรือ CR ในช่องค้นหาของตาราง ASCII

«ASCII ขยาย» ไม่ใช่มาตรฐาน

เนื่องจากไบต์มี 8 บิต และ ASCII ใช้เพียง 7 บิต จึงเหลือ 128 รหัสว่าง (128 ถึง 255) และผู้ผลิตกับแต่ละภูมิภาคก็เติมในแบบของตัวเอง สิ่งนี้เรียกว่า «ASCII ขยาย» แต่ไม่มีตารางเดียว มีหลายตาราง เรียกว่าโค้ดเพจ สองตารางที่รู้จักมากที่สุดคือ Latin-1 (ISO-8859-1) ซึ่ง é คือรหัส 233 และ Windows-1252 ซึ่งคล้ายกันแต่ต่างกันในรหัส 128 ถึง 159 (ที่นั่นมียูโร เป็นต้น)

ปัญหาคือรหัส 233 หมายถึง «é» ในตารางหนึ่ง และหมายถึงอย่างอื่นในอีกตารางหนึ่ง ข้อความที่เขียนด้วยตารางหนึ่งแล้วอ่านด้วยอีกตารางหนึ่งจะแสดงเป็นขยะ Unicode เกิดมาเพื่อยุติความวุ่นวายนี้

Unicode และ UTF-8

Unicode กำหนดหมายเลขเฉพาะเรียกว่าจุดรหัส (code point) ให้แก่อักขระของระบบการเขียนเกือบทั้งหมดในโลก รวมสัญลักษณ์และอีโมจิ ปัจจุบันมีอักขระมากกว่า 150,000 ตัว เขียนด้วยคำนำหน้า U+ และเป็นฐานสิบหก: «A» คือ U+0041, «ñ» คือ U+00F1, ยูโรคือ U+20AC และอีโมจิหน้ายิ้มคือ U+1F600 จุดรหัส 128 จุดแรกตรงกับ ASCII ทุกประการ

UTF-8 เป็นวิธีที่ใช้มากที่สุดในการเก็บตัวเลขเหล่านั้นเป็นไบต์ และใช้ตั้งแต่ 1 ถึง 4 ไบต์ตามอักขระ 128 ตัวของ ASCII ใช้ไบต์เดียวเหมือนเดิม ดังนั้นข้อความ ASCII ก็เป็นข้อความ UTF-8 ที่ถูกต้องด้วย ส่วนที่เหลือใช้หลายไบต์กว่า

ยิ่งห่างจาก ASCII มากเท่าไร อักขระยิ่งใช้ไบต์มากเท่านั้น
อักขระจุดรหัสไบต์ใน UTF-8ไบต์ (ฐานสิบหก)
AU+0041141
éU+00E92C3 A9
ñU+00F12C3 B1
€U+20AC3E2 82 AC
😀U+1F6004F0 9F 98 80

ทำไมจึงขึ้นเป็น «Ã±» แทน «ñ»

นี่เป็นข้อผิดพลาดที่พบบ่อยที่สุดและอธิบายได้แน่นอน ñ ใน UTF-8 คือสองไบต์: C3 และ B1 ถ้าโปรแกรมเชื่อว่าข้อความเป็น Latin-1 จะอ่านแต่ละไบต์เป็นอักขระ: C3 คือ «Ã» และ B1 คือ «±» ผลลัพธ์: «Ã±» เกิดเรื่องเดียวกันกับ «é» ซึ่งแสดงเป็น «Ã©» และกับ «canción» ซึ่งปรากฏเป็น «canción»

วิธีแก้เกือบทุกครั้งคือบอกโปรแกรมให้เปิดไฟล์เป็น UTF-8 (ในโปรแกรมแก้ไขข้อความ หรือในการตั้งค่านำเข้าของสเปรดชีต) ในกรณีกลับกัน คือข้อความ Latin-1 ที่อ่านเป็น UTF-8 มักจะเห็นสี่เหลี่ยมขนมเปียกปูนที่มีเครื่องหมายคำถาม เพราะไบต์เดี่ยวเหล่านั้นไม่ได้เป็นลำดับ UTF-8 ที่ถูกต้อง

วิธีใช้ตาราง ASCII และตัวแปลง

เครื่องมือ «ตาราง ASCII» แสดงอักขระ 128 ตัวพร้อมรหัสในฐานสิบ ฐานสิบหก ฐานแปด และฐานสอง และชื่อของอักขระควบคุม

  1. พิมพ์อักขระ รหัส หรือชื่อของอักขระควบคุมในช่องค้นหา (เช่น A, 65, 41 หรือ LF) เพื่อหาแถวของมัน
  2. ใช้ปุ่มกรอง (ควบคุม ตัวเลข ตัวพิมพ์ใหญ่ ตัวพิมพ์เล็ก เครื่องหมาย) เพื่อดูเฉพาะกลุ่มหนึ่ง
  3. ถ้าจะแปลง พิมพ์ข้อความใน «ข้อความ» แล้วเลือกรูปแบบ (ฐานสิบ ฐานสิบหก ฐานแปด หรือฐานสอง): ด้านล่างจะแสดงรหัส «Hola» ให้ 72 111 108 97 ในฐานสิบ และ 48 6F 6C 61 ในฐานสิบหก
  4. ทำกลับกันได้ด้วย: วางรหัสที่คั่นด้วยช่องว่างหรือจุลภาคใน «รหัส» แล้วข้อความจะถูกสร้างขึ้น ในฐานสิบหกรองรับคำนำหน้าอย่าง 0x41

ถ้าข้อความมีอักขระที่ไม่ใช่ ASCII เช่น ñ เครื่องมือจะแจ้งและแสดงรหัส Unicode ของมัน ถ้าจะดูไบต์จริงใน UTF-8 ให้ใช้ «แปลงข้อความเป็นเลขฐานสอง»: ñ ให้ 11000011 10110001 สองไบต์ 8 บิต ข้อจำกัด: ตารางแสดงเฉพาะ ASCII มาตรฐาน ไม่ใช่แบบขยาย และทุกอย่างคำนวณในเบราว์เซอร์ของคุณโดยไม่ส่งข้อความไปยังเซิร์ฟเวอร์ใด ๆ

คำถามที่พบบ่อย

ASCII มีกี่อักขระ

128 ตัว รหัสตั้งแต่ 0 ถึง 127 ตัวละ 7 บิต โดย 33 ตัวเป็นอักขระควบคุม และ 95 ตัวเป็นอักขระที่พิมพ์ได้ รวมช่องว่าง

รหัส ASCII ของตัวอักษร A และ a คืออะไร

«A» คือ 65 (41 ในฐานสิบหก, 01000001 ในฐานสอง) และ «a» คือ 97 (61 ในฐานสิบหก, 01100001 ในฐานสอง) ต่างกัน 32 เสมอ

ASCII ต่างจาก Unicode อย่างไร

ASCII มี 128 อักขระที่ออกแบบสำหรับภาษาอังกฤษ ส่วน Unicode มีมากกว่า 150,000 ตัว จากเกือบทุกภาษาและอีโมจิ และ 128 ตัวแรกเหมือนกับ ASCII

UTF-8 คืออะไร

เป็นวิธีที่ใช้มากที่สุดในการเก็บข้อความ Unicode เป็นไบต์ ใช้ 1 ถึง 4 ไบต์ต่ออักขระ: ASCII ใช้หนึ่งไบต์ ñ ใช้สอง และอีโมจิใช้สี่

ทำไมข้อความของฉันแสดง «Ã±» หรือ «Ã©»

เพราะข้อความที่บันทึกเป็น UTF-8 ถูกอ่านเป็น Latin-1 เปิดไฟล์โดยระบุการเข้ารหัส UTF-8 แล้วจะแก้ไขได้