การแปลงข้อความเป็นเลขฐานสองคือการเปลี่ยนตัวอักษรแต่ละตัวเป็นไบต์ แล้วเขียนแต่ละไบต์ด้วยเลข 0 และ 1 ตัวอักษรภาษาอังกฤษอย่าง A ใช้ 1 ไบต์ แต่อักษรไทยใช้ 3 ไบต์เมื่อเข้ารหัสแบบ UTF-8 ตัว ก จึงออกมาเป็น 11100000 10111000 10000001
ความยาวนี้เป็นไปตามวิธีที่ UTF-8 เก็บอักษรไทย ไม่ใช่ความผิดพลาดของเครื่องมือ ถ้าเข้าใจว่าไบต์ถูกจัดกลุ่มอย่างไร คุณจะอ่านผลลัพธ์ได้ถูกต้อง และแปลงเลขฐานสองกลับเป็นตัวอักษรไทยได้โดยไม่เจออักขระเพี้ยน
วิธีแปลงข้อความเป็นเลขฐานสองด้วยตัวแปลงเลขฐานสอง
เปิด “ตัวแปลงเลขฐานสอง” วางข้อความ เลือกประเภท “เป็นไบนารี” แล้วกด “ส่ง” ผลลัพธ์จะแสดงเป็นรายไบต์และคั่นด้วยเว้นวรรค เครื่องมือทุกตัวที่กล่าวถึงในบทความนี้อยู่บน Digily Link ซึ่งเป็นผลิตภัณฑ์ของเราเอง
- วางหรือพิมพ์ข้อความลงในช่อง “เนื้อหา” เช่น ก
- ในช่อง “ประเภท” ให้เลือก “เป็นไบนารี”
- กดปุ่ม “ส่ง”
- ดูผลในช่อง “ผลลัพธ์” ตัว ก จะได้ 11100000 10111000 10000001
- กดไอคอนคัดลอก (“คัดลอกไปยังคลิปบอร์ด”) แล้วนำไปวางในงานที่ต้องการ
ถ้าต้องการแปลงเลขฐานสองกลับเป็นตัวอักษร ให้วางตัวเลขในช่อง “เนื้อหา” แล้วเลือก “เป็นข้อความ” ควรใช้เว้นวรรคคั่นระหว่างค่าไบต์แต่ละตัว เช่น 11100000 10111000 10000001 เพราะเครื่องมือใช้เว้นวรรคเป็นตัวแบ่งไบต์
ขั้นตอนเดียวกันนี้ใช้ได้กับ ตัวแปลงเลขฐานสิบหกเพื่อแปลงข้อความเป็นเลขฐานสิบหก โดยเลือกประเภท “เป็นเลขฐานสิบหก” และใช้กับ ตัวแปลงเลขทศนิยมซึ่งแสดงค่าไบต์ของ UTF-8 เป็นเลขฐานสิบ โดยเลือก “เป็นเลขทศนิยม” แม้ชื่อเครื่องมือจะใช้คำว่าทศนิยม แต่ผลที่ได้คือเลขฐานสิบของแต่ละไบต์
ตารางด้านล่างแสดงตัวอย่างผลลัพธ์จากเครื่องมือทั้งสามตัว โดยย่อผลเลขฐานสองของข้อความที่ยาว
| ข้อความ | ตัวแปลงเลขฐานสอง | ตัวแปลงเลขฐานสิบหก | ตัวแปลงเลขทศนิยม |
|---|---|---|---|
| A | 1000001 | 41 | 65 |
| Hi | 1001000 1101001 | 4869 | 72 105 |
| ก | 11100000 10111000 10000001 | e0b881 | 224 184 129 |
| ฿100 | 11100000 10111000 10111111 110001 110000 110000 | e0b8bf313030 | 224 184 191 49 48 48 |
| สวัสดี | 18 กลุ่ม กลุ่มละ 8 บิต (ไม่แสดงทั้งหมด) | e0b8aae0b8a7e0b8b1e0b8aae0b894e0b8b5 | 224 184 170 224 184 167 224 184 177 224 184 170 224 184 148 224 184 181 |
แถว ฿100 เห็นความต่างได้ชัดที่สุด สัญลักษณ์ ฿ ใช้ 3 ไบต์เพราะอยู่ในช่วงอักษรไทย ส่วนเลขอารบิก 1 0 0 ใช้ตัวละ 1 ไบต์ ในข้อความเดียวกันจึงมีทั้งชุด 3 ไบต์ของ ฿ และไบต์เดี่ยวของตัวเลข ซึ่งเครื่องมือแสดงโดยไม่เติม 0 ด้านหน้าจึงดูสั้นกว่า
ทำไมอักษรไทยจึงใช้ 3 ไบต์ใน UTF-8
อักษรไทยทุกตัวใช้ 3 ไบต์ เพราะเลขรหัส Unicode ของอักษรไทยอยู่ในช่วงที่มาตรฐาน UTF-8 กำหนดให้เก็บด้วย 3 ไบต์ ไฟล์ Blocks.txt ของ Unicode (ตรวจเมื่อ 29 ตุลาคม 2569) ระบุว่าบล็อกอักษรไทยอยู่ที่ U+0E00 ถึง U+0E7F ในบล็อกนี้มีทั้งตัว ก (U+0E01) สัญลักษณ์ ฿ (U+0E3F) และเลขไทยตั้งแต่ ๐ (U+0E50) ถึง ๙ (U+0E59)
เอกสาร RFC 3629 ส่วนที่ 3 ซึ่งกำหนดมาตรฐาน UTF-8 แบ่งจำนวนไบต์ตามช่วงรหัสไว้ดังนี้
| ช่วงรหัส Unicode | จำนวนไบต์ | รูปแบบบิต |
|---|---|---|
| 0000 ถึง 007F (เช่น A) | 1 | 0xxxxxxx |
| 0080 ถึง 07FF | 2 | ดูใน RFC 3629 |
| 0800 ถึง FFFF ยกเว้น D800 ถึง DFFF (อักษรไทยทั้งบล็อก) | 3 | 1110xxxx 10xxxxxx 10xxxxxx |
| 10000 ถึง 10FFFF | 4 | ดูใน RFC 3629 |
ลองนำ ก มาใส่ในรูปแบบนี้ดู เริ่มจากเขียน 0E01 เป็นเลขฐานสอง 16 บิต ได้ 0000 1110 0000 0001 จากนั้นแบ่งเป็น 3 ส่วน ยาว 4, 6 และ 6 บิต ได้ 0000, 111000 และ 000001 แล้วนำไปแทนตำแหน่ง x ทีละส่วน จะได้ 11100000 10111000 10000001 ซึ่งเขียนเป็นฐานสิบหกได้ว่า E0 B8 81
สิ่งที่ทำให้ตัวเลขยาวขึ้นคือบิตส่วนหัว เลข 1110 ในไบต์แรกบอกว่าตัวอักษรนี้มี 3 ไบต์ ส่วน 10 ในไบต์ที่สองและที่สามบอกว่าเป็นไบต์ที่ต่อจากไบต์แรก จากทั้งหมด 24 บิต จึงเหลือตำแหน่งสำหรับเก็บเลขรหัส Unicode 16 บิต ซึ่งอาจมี 0 นำหน้าได้
ตัว ก ในระบบ Unicode UTF-8 และ TIS-620
อักษร ก มีค่ารหัสต่างกันตามระบบที่ใช้ ขึ้นอยู่กับว่ากำลังดูเลขรหัส Unicode ไบต์ของ UTF-8 หรือไบต์ของ TIS-620 ตารางนี้รวบรวมจากตารางทางการของ Unicode และ RFC 3629
| ระบบ | ค่าของ ก |
|---|---|
| เลขรหัส Unicode | U+0E01 (ฐานสิบ 3585) |
| UTF-8 ฐานสิบหก | E0 B8 81 |
| UTF-8 ฐานสิบ | 224 184 129 |
| UTF-8 ฐานสอง | 11100000 10111000 10000001 |
| TIS-620 และ ISO 8859-11 (สำหรับตัว ก) | A1 (ฐานสิบ 161 ฐานสอง 10100001) |
ในรหัส TIS-620 ตัว ก ใช้ 1 ไบต์ คือ A1 (ฐานสิบหก) แต่ใน UTF-8 ใช้ 3 ไบต์ คือ E0 B8 81 ไฟล์ ตารางเทียบรหัส ISO 8859-11 ของ Unicode (ตรวจเมื่อ 29 ตุลาคม 2569) ระบุว่ามาตรฐาน ISO/IEC 8859-11 ฉบับปี 2001 เทียบเท่ากับ TIS 620-2533 (1990) ต่างกันเพียงการเพิ่มอักขระ NO-BREAK SPACE ที่ตำแหน่ง A0 ไฟล์เดียวกันยืนยันว่า ก มีค่า A1
เลข 3585 คือเลขรหัสของตัวอักษร ไม่ใช่ค่าไบต์ที่เครื่องมือใช้ หากนำสองค่านี้มาใช้สลับกัน การแปลงกลับจะได้ตัวอักษรผิด ดูรายละเอียดได้ในตารางข้อควรระวังด้านล่าง
สาเหตุหนึ่งที่ข้อความไทยกลายเป็นอักขระเพี้ยนคือไฟล์ที่บันทึกแบบ TIS-620 ถูกเปิดแบบ UTF-8 ไบต์ A1 (10100001) ซึ่งแทนตัว ก ใน TIS-620 ขึ้นต้นด้วย 10 จึงเป็นไบต์เริ่มต้นของ UTF-8 ไม่ได้ โปรแกรมจึงแสดงอักขระทดแทนหรือข้อความที่อ่านไม่ออก
วิธีแปลงเลขฐานสองกลับเป็นตัวอักษรไทยด้วยมือ
การแปลงเลขฐานสองกลับเป็นตัวอักษรไทยด้วยมือทำได้โดยแยกกลุ่มตามเว้นวรรค (ถ้าเป็นเลขต่อกันยาว ๆ ให้แบ่งทีละ 8 บิต) เติม 0 ทางซ้ายให้แต่ละกลุ่มครบ 8 บิต แปลงแต่ละกลุ่มเป็นตัวเลข แล้วนับไบต์ที่ขึ้นต้นด้วย 1110 รวมกับไบต์ต่อเนื่องที่ขึ้นต้นด้วย 10 อีก 2 ไบต์เป็นตัวอักษร 1 ตัว ลองฝึกกับ 11100000 10111000 10101010
- แยกเป็นกลุ่มละ 8 บิต ได้ 11100000, 10111000 และ 10101010
- แปลงแต่ละกลุ่มเป็นฐานสิบ ได้ 224, 184 และ 170 หรือแปลงเป็นฐานสิบหก ได้ E0, B8 และ AA
- ไบต์แรกขึ้นต้นด้วย 1110 แปลว่าไบต์นี้กับอีก 2 ไบต์ถัดไปรวมกันเป็นตัวอักษรตัวเดียว
- ตัดส่วนหัวออก คือ 1110 ในไบต์แรก และ 10 ในไบต์ที่สองกับที่สาม จะเหลือ 0000, 111000 และ 101010
- นำมาต่อกันเป็น 0000111000101010 แล้วแปลงเป็นฐานสิบหกทีละ 4 บิต ได้ 0E2A
- ค้นในฐานข้อมูลอักขระของ Unicode (UnicodeData.txt) จะพบว่า U+0E2A คือ THAI CHARACTER SO SUA หรือตัว ส
เครื่องมือนี้ไม่เติม 0 ด้านหน้า กลุ่มที่สั้นกว่า 8 หลักจึงต้องเติม 0 ทางซ้ายให้ครบก่อนตรวจรูปแบบบิต ใน UTF-8 ไบต์รูปแบบ 0xxxxxxx คืออักขระ 1 ไบต์ เช่น อักษรละตินหรือเลขอารบิก ส่วน 110xxxxx, 1110xxxx และ 11110xxx เป็นไบต์แรกของชุด 2, 3 และ 4 ไบต์ และ 10xxxxxx เป็นไบต์ต่อเนื่อง เช่น 110001 ในแถว ฿100 เติมเป็น 00110001 มีค่าเท่ากับ 49 ในฐานสิบ ซึ่งก็คือเลข 1
คำที่ยาวขึ้นก็ใช้หลักเดียวกัน คำว่า สวัสดี ประกอบด้วยจุดรหัส Unicode 6 ตำแหน่ง คือ ส ว ั ส ด ี จึงยาว 18 ไบต์ จำนวนจุดรหัสนี้อาจไม่เท่ากับจำนวนตัวที่ตามองเห็น เพราะสระ ั และ ี ซ้อนอยู่บนพยัญชนะ เขียนเป็นฐานสิบได้ว่า 224 184 170 224 184 167 224 184 177 224 184 170 224 184 148 224 184 181 ให้อ่านทีละ 3 ไบต์ ชุดแรก 224 184 170 คือตัว ส จากแบบฝึกหัดข้างต้น และชุดที่สี่ก็มีค่าเดียวกันเพราะเป็นตัว ส เหมือนกัน คุณใช้วิธีนี้ตรวจผลลัพธ์จากเครื่องมือด้วยตัวเองได้
ข้อควรระวังเวลาใช้ตัวแปลงเลขฐานสอง ฐานสิบหก และฐานสิบ
ข้อควรระวังหลักคือ ตัวแปลงเลขฐานสองไม่เติม 0 ด้านหน้า ตัวแปลงเลขฐานสิบหกแปลงกลับไม่ได้ถ้าใส่ตัวเลขแบบเว้นวรรค และตัวแปลงเลขทศนิยมใช้ค่าไบต์ของ UTF-8 ไม่ใช่เลขรหัส Unicode ถ้าแปลงกลับแล้วผลไม่ตรง ให้ตรวจรูปแบบของตัวเลขที่ใส่ก่อน ตารางนี้สรุปพฤติกรรมของเครื่องมือที่ควรรู้ไว้ก่อนใช้งาน
| สถานการณ์ | สิ่งที่เกิดขึ้น | วิธีแก้ |
|---|---|---|
| แปลงข้อความเป็นเลขฐานสอง | ตัวแปลงเลขฐานสองแสดงแต่ละไบต์คั่นด้วยเว้นวรรค และไม่เติม 0 ด้านหน้า ตัว A จึงแสดงเป็น 1000001 ไม่ใช่ 01000001 ค่าทั้งสองเท่ากัน | ถ้างานของคุณต้องใช้ไบต์ละ 8 บิตเต็ม ให้เติม 0 ด้านหน้าเอง |
| แปลงเลขฐานสองกลับเป็นข้อความ | เครื่องมือแยกไบต์ด้วยเว้นวรรค | เว้นวรรคระหว่างไบต์ทุกครั้ง |
| ใส่เลขฐานสิบหกแบบเว้นวรรค เช่น E0 B8 81 | ผลลัพธ์ว่าง | เวลาแปลงเลขฐานสิบหกกลับเป็นข้อความ ให้ใส่ตัวเลขติดกันโดยไม่เว้นวรรค เช่น e0b881 ซึ่งผลลัพธ์จากเครื่องมือก็เป็นตัวพิมพ์เล็กติดกันอยู่แล้ว |
| เลขฐานสิบหกมีจำนวนหลักเป็นเลขคี่ | อาจแปลงไม่สำเร็จ | ตรวจว่ามีครบ 2 หลักต่อไบต์ อักษรไทย 1 ตัวต้องมี 6 หลัก |
| ใส่ 3585 ในตัวแปลงเลขทศนิยม | ตัวแปลงเลขทศนิยมใช้ค่าไบต์ของ UTF-8 ถ้าใส่ 3585 ซึ่งเป็นเลขรหัส Unicode ของ ก จะไม่ได้ตัว ก กลับมา แต่ได้อักขระรหัส 0x01 แทน | ใส่ค่าไบต์ 224 184 129 |
| ข้อความมีแท็ก HTML หรือเครื่องหมาย < | แท็กถูกลบออก และข้อความหลัง < ที่ไม่มีการปิดอาจหายไปด้วย | ตรวจผลลัพธ์ทุกครั้งเมื่อข้อความมีเครื่องหมายนี้ |
| ข้อความมีเครื่องหมาย ' หรือ " | เครื่องหมายนี้ถูกเปลี่ยนเป็นรหัส HTML ' หรือ " ก่อนแปลง ผลลัพธ์จึงมีไบต์ของรหัสเหล่านี้แทนเครื่องหมายเดิม | ถ้าต้องการไบต์ของเครื่องหมายจริง ให้ลบเครื่องหมายออกก่อนแปลงแล้วเติมไบต์เอง |
| ข้อความหลายบรรทัด | การขึ้นบรรทัดใหม่ (ไบต์ 0D และ 0A) ถูกแสดงโดยไม่เติม 0 ด้านหน้าเป็น 1101 และ 1010 แต่เมื่อแปลงกลับด้วยตัวแปลงเลขฐานสอง ไบต์เหล่านี้ไม่กลับมาเป็นการขึ้นบรรทัดเดิม | แปลงทีละบรรทัด หรือใช้ตัวแปลงเลขฐานสิบหก ซึ่งแปลงการขึ้นบรรทัดกลับได้ |
| มีเว้นวรรคที่ต้นหรือท้ายข้อความ | เว้นวรรคเหล่านั้นถูกตัดทิ้งก่อนแปลง | ผลลัพธ์จะไม่มีรหัสของเว้นวรรคที่ต้นและท้ายข้อความ |
ถ้าต้องการลองกับข้อความของคุณเอง ให้แปลงข้อความเป็นเลขฐานสองด้วยตัวแปลงเลขฐานสอง แล้วนำผลลัพธ์ไปแปลงกลับด้วยประเภท “เป็นข้อความ” ถ้าเป็นข้อความบรรทัดเดียวและได้ข้อความเดิมครบทุกตัว แสดงว่าการแปลงไปและกลับในกรณีนั้นใช้ได้ แต่ไม่ได้ยืนยันว่าทุกไบต์ของต้นฉบับถูกเก็บครบ เพราะเครื่องมือตัดเว้นวรรคหัวท้ายและปรับเครื่องหมายบางตัวก่อนแปลง
คำถามที่พบบ่อย
แปลงเลขฐาน 2 เป็นตัวอักษรทำอย่างไร
วางเลขฐานสองในตัวแปลงเลขฐานสอง เลือกประเภท “เป็นข้อความ” แล้วกด “ส่ง” ถ้าได้ตัวอักษรไม่ตรง ให้ตรวจว่าเว้นวรรคระหว่างไบต์แล้ว และอักษรไทยแต่ละตัวมีครบ 3 ไบต์ ถ้าไบต์ใดหายไป ตัวอักษรตัวนั้นอาจอ่านไม่ออก
ภาษาไทยใช้กี่ไบต์ใน UTF-8
อักขระไทย 1 ตัวใช้ 3 ไบต์ ไม่ว่าจะเป็นพยัญชนะ สระที่เป็นอักขระแยกอย่าง ั และ ี สัญลักษณ์ ฿ หรือเลขไทย ส่วนอักษรอังกฤษและเลขอารบิกใช้ตัวละ 1 ไบต์ ให้นับตามจำนวนจุดรหัส Unicode ไม่ใช่จำนวนพยางค์หรือจำนวนตัวที่มองเห็น
ตัวแปลง ASCII ใช้กับภาษาไทยได้ไหม
ใส่ภาษาไทยใน “ตัวแปลง ASCII” ได้ แต่แม้ชื่อเครื่องมือจะเป็น ASCII สิ่งที่ได้คือค่าไบต์ของ UTF-8 เช่น ก ได้ 224 184 129 เหมือนกับตัวแปลงเลขทศนิยม ค่านี้ไม่ใช่รหัส ASCII ของ ก เพราะ ASCII เป็นรหัส 7 บิตที่มีค่า 0 ถึง 127 และไม่มีตัวอักษรไทย
ข้อความที่ใส่ในตัวแปลงถูกเก็บไว้ไหม
ข้อความจะถูกส่งไปประมวลผลบนเซิร์ฟเวอร์ ไม่ได้แปลงในเครื่องของคุณ จากโค้ดส่วนแปลงที่เราตรวจ ไม่พบการบันทึกข้อความที่ใส่ลงฐานข้อมูล มีเพียงการนับจำนวนครั้งที่ใช้งาน ถึงอย่างนั้นก็ไม่ควรใส่รหัสผ่านหรือข้อมูลส่วนตัว