ข้อความภาษาไทยที่มีทั้งพยัญชนะ สระลอย และวรรณยุกต์ซ้อนกันหลายชั้น ไม่สามารถใส่ลงใน URL ได้ตรง ๆ — ทุกตัวอักษรต้องแปลงเป็น percent-encoding ก่อน ต่างจากภาษาที่เขียนด้วยอักษรละตินซึ่งมีแค่บางสัญลักษณ์เท่านั้นที่ต้องเข้ารหัส
ทำไมคำไทยสั้น ๆ ถึงกลายเป็น % ยาวเป็นพรืด
ตัวอักษรไทยแต่ละตัวถูกเข้ารหัสเป็น UTF-8 จำนวน 3 ไบต์ก่อน แล้วแต่ละไบต์ถึงถูกเขียนเป็น %XX — ตัวอักษร "ก" กลายเป็น %E0%B8%81 คือ 1 ตัวอักษรกลายเป็น 9 ตัวโค้ด และเพราะภาษาไทยไม่มีการเว้นวรรคระหว่างคำ ทำให้ข้อความค้นหาที่แชร์ผ่าน LINE ซึ่งเป็นแอปแชตยอดนิยมในไทยมักจะยาวขึ้นหลายเท่าตัวหลังเข้ารหัส
ความต่างของ encodeURIComponent กับ encodeURI
encodeURIComponent เข้ารหัสอักขระที่มีความหมายเชิงโครงสร้างเกือบทั้งหมด เช่น &, ?, =, / จึงเหมาะกับค่าพารามิเตอร์เดียว เช่น คำค้นหาที่จะใส่ใน ?q= ส่วน encodeURI จะไม่แตะอักขระโครงสร้างเหล่านี้ เพราะออกแบบมาเพื่อเข้ารหัส URL ทั้งเส้นที่ประกอบเสร็จแล้ว
ข้อผิดพลาดที่พบบ่อย
ถ้าเข้ารหัส query string ทั้งเส้นด้วย encodeURIComponent ทีเดียว อักขระ & และ = ที่ใช้แยกพารามิเตอร์ก็จะกลายเป็น %26 และ %3D ไปด้วย เซิร์ฟเวอร์จะได้รับพารามิเตอร์เดียวที่อ่านไม่ออก แทนที่จะได้หลายค่าแยกกัน ต้องเข้ารหัสแต่ละค่าแยกกันเสมอ
เมื่อไหร่ที่ต้องใช้
- ใส่คำค้นหาหรือชื่อสินค้าภาษาไทยลงในพารามิเตอร์ของ query
- สร้างลิงก์ที่มีค่าไดนามิก เช่น คำค้นหาหรือรหัสอ้างอิง
- ตรวจสอบ: ถอดรหัส URL เพื่อดูว่าข้อมูลจริงที่ซ่อนอยู่คืออะไร
กรณีพิเศษ: การเข้ารหัสซ้อนสองชั้น
ถ้าสตริงที่เข้ารหัสแล้วถูกเข้ารหัสซ้ำอีกครั้งโดยไม่ตั้งใจ เครื่องหมาย % เองจะกลายเป็น %25 ทำให้ผลลัพธ์กลายเป็นข้อความอ่านไม่ออกที่เข้ารหัสซ้อนกันสองชั้น (%E0%B8%81 กลายเป็น %25E0%25B8%2581) มักเกิดขึ้นเมื่อเฟรมเวิร์กเข้ารหัส URL ให้อัตโนมัติอยู่แล้ว แต่นักพัฒนาเรียก encodeURIComponent เพิ่มเองอีกครั้งกับค่าที่เข้ารหัสไปแล้ว