การเข้ารหัสอักขระคืออะไร
การเข้ารหัสคือข้อตกลง: «เลข 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 รวมช่องว่าง)
ไม่มีตัวอักษรที่มีเครื่องหมายกำกับ ไม่มี ñ และไม่มีสัญลักษณ์ยูโร: ออกแบบมาสำหรับภาษาอังกฤษ นี่อธิบายว่าทำไมภายหลังจึงต้องมีตารางอื่น
| อักขระควบคุม | ฐานสิบ | ฐานสิบหก | ฐานสอง (7 บิต) | ใช้ทำอะไร |
|---|---|---|---|---|
| ค่าว่าง (NUL) | 0 | 00 | 0000000 | ระบุจุดสิ้นสุดของสตริงในหลายภาษา |
| แท็บแนวนอน (TAB) | 9 | 09 | 0001001 | กระโดดไปยังตำแหน่งแท็บถัดไป |
| ขึ้นบรรทัดใหม่ (LF) | 10 | 0A | 0001010 | ลงไปบรรทัดถัดไป |
| กลับต้นบรรทัด (CR) | 13 | 0D | 0001101 | กลับไปต้นบรรทัด |
| หลุดออก (ESC) | 27 | 1B | 0011011 | เริ่มลำดับควบคุม |
| ช่องว่าง | 32 | 20 | 0100000 | อักขระที่พิมพ์ได้ตัวแรก |
| ลบ (DEL) | 127 | 7F | 1111111 | ลบอักขระ |
ความสัมพันธ์ที่ควรจำ
ตารางไม่ได้เรียงแบบสุ่ม เมื่อรู้ความสม่ำเสมอไม่กี่ข้อ ก็อ่านรหัสจากความจำได้
- ตัวเลข «0» ถึง «9» อยู่ที่ 48 ถึง 57 (30 ถึง 39 ในฐานสิบหก) ค่าของตัวเลขคือรหัสลบ 48: «7» คือ 55 และ 55 − 48 = 7
- ตัวพิมพ์ใหญ่อยู่ตั้งแต่ 65 («A») ถึง 90 («Z») และตัวพิมพ์เล็กตั้งแต่ 97 («a») ถึง 122 («z»)
- ผลต่างระหว่างตัวพิมพ์ใหญ่กับตัวพิมพ์เล็กของมันเป็น 32 เสมอ: «A» = 65 และ «a» = 97; «C» = 67 และ «c» = 99 ในฐานสองเปลี่ยนเพียงบิตเดียว: 01000001 สำหรับ «A» และ 01100001 สำหรับ «a»
- ถ้าจะรู้ว่าตัวพิมพ์ใหญ่อยู่ลำดับที่เท่าไรในตัวอักษร ให้ลบ 64: «C» คือ 67 และ 67 − 64 = 3 คือตัวที่สาม
- เนื่องจากตัวพิมพ์ใหญ่ทั้งหมด (65 ถึง 90) มีรหัสน้อยกว่าตัวพิมพ์เล็ก (97 ถึง 122) การเรียงตามตัวอักษร «ตามรหัส» จึงวาง «Zebra» ก่อน «apple» โปรแกรมหลายตัวต้องมีตัวเลือกเปรียบเทียบแยกต่างหากเพื่อเรียงให้ถูก
การขึ้นบรรทัดใหม่: 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 ที่ถูกต้องด้วย ส่วนที่เหลือใช้หลายไบต์กว่า
| อักขระ | จุดรหัส | ไบต์ใน UTF-8 | ไบต์ (ฐานสิบหก) |
|---|---|---|---|
| A | U+0041 | 1 | 41 |
| é | U+00E9 | 2 | C3 A9 |
| ñ | U+00F1 | 2 | C3 B1 |
| € | U+20AC | 3 | E2 82 AC |
| 😀 | U+1F600 | 4 | F0 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 ตัวพร้อมรหัสในฐานสิบ ฐานสิบหก ฐานแปด และฐานสอง และชื่อของอักขระควบคุม
- พิมพ์อักขระ รหัส หรือชื่อของอักขระควบคุมในช่องค้นหา (เช่น A, 65, 41 หรือ LF) เพื่อหาแถวของมัน
- ใช้ปุ่มกรอง (ควบคุม ตัวเลข ตัวพิมพ์ใหญ่ ตัวพิมพ์เล็ก เครื่องหมาย) เพื่อดูเฉพาะกลุ่มหนึ่ง
- ถ้าจะแปลง พิมพ์ข้อความใน «ข้อความ» แล้วเลือกรูปแบบ (ฐานสิบ ฐานสิบหก ฐานแปด หรือฐานสอง): ด้านล่างจะแสดงรหัส «Hola» ให้ 72 111 108 97 ในฐานสิบ และ 48 6F 6C 61 ในฐานสิบหก
- ทำกลับกันได้ด้วย: วางรหัสที่คั่นด้วยช่องว่างหรือจุลภาคใน «รหัส» แล้วข้อความจะถูกสร้างขึ้น ในฐานสิบหกรองรับคำนำหน้าอย่าง 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 แล้วจะแก้ไขได้