tooliv

เข้ารหัส URL

เข้ารหัสและถอดรหัส URL

อินพุต

ผลลัพธ์

URL Encoding: ทำไมเบราว์เซอร์เปลี่ยนช่องว่างเป็น %20

เคยสังเกตตัว %20 กับ %3D แปลกๆ ใน URL ไหม? นั่นคือ URL encoding (หรือ percent encoding) URL รับอักขระได้แค่ชุดจำกัด -- ตัวอักษร ตัวเลข กับสัญลักษณ์ไม่กี่ตัว นอกนั้น -- ช่องว่าง ตัวอักษรภาษาไทย อักขระพิเศษ -- ต้องแปลงเป็น %XX ถึงจะเดินทางข้ามเว็บได้อย่างปลอดภัย

ความแตกต่างระหว่าง encodeURIComponent กับ encodeURI

JavaScript มีฟังก์ชันคล้ายกัน 2 ตัว encodeURIComponent() ใช้สำหรับ encode ค่าพารามิเตอร์ จะแปลง slash และ ? ด้วย ส่วน encodeURI() ใช้กับ URL ทั้งหมด จะเก็บอักขระโครงสร้าง URL ไว้ ใช้ผิดอาจทำให้เกิด double encoding หรือโครงสร้าง URL พัง

ทำไม URL ถึงใช้อักขระอะไรก็ได้ไม่ได้

URL เป็นไปตามสเปคชื่อ RFC 3986 ซึ่งเข้มงวดมากเรื่องอักขระที่อนุญาต: ตัวอักษร ตัวเลข กับสัญลักษณ์บางตัวอย่างขีดกลางกับจุด แค่นั้น อักขระอย่าง & กับ = มีหน้าที่ใน URL อยู่แล้ว -- ใช้แยกพารามิเตอร์ ดังนั้นถ้าข้อมูลจริงมี & หรือ = ต้องเข้ารหัสไม่งั้นเซิร์ฟเวอร์จะสับสนว่าพารามิเตอร์หนึ่งจบตรงไหนและอันต่อไปเริ่มตรงไหน เช่นเดียวกับช่องว่าง อักขระภาษาไทย และอะไรก็ตามที่ไม่ใช่ ASCII ธรรมดา

อักขระที่ถูก Encode บ่อยที่สุด

ช่องว่างกลายเป็น %20 (หรือ + ในบางบริบท) เครื่องหมาย & กลายเป็น %26, = กลายเป็น %3D, ? กลายเป็น %3F ภาษาไทยและอักขระ non-ASCII จะถูกเข้ารหัสเป็น UTF-8 ก่อน แล้วแต่ละไบต์จะกลายเป็น %XX ของตัวเอง ดังนั้นอักขระตัวเดียวอาจกลายเป็น %XX สามตัวขึ้นไป เครื่องหมายทับ (/) เป็นตัวคั่น path ดังนั้นเข้ารหัสแค่ตอนมันอยู่ในค่าพารามิเตอร์ ไม่ใช่ใน path ของ URL เอง

เคล็ดลับ URL Encoding สำหรับนักพัฒนา

กฎทอง: เข้ารหัสค่าพารามิเตอร์ ไม่ใช่ URL ทั้งหมด ใน JavaScript encodeURIComponent() จัดการค่าได้สมบูรณ์แบบ ส่วน encodeURI() ใช้กับ URL เต็มและจะปล่อยอักขระโครงสร้างไว้ Python ใช้ urllib.parse.quote() ระวังเรื่อง double encoding -- เกิดขึ้นเมื่อคุณ encode สตริงที่ถูก encode ไปแล้วโดยไม่ตั้งใจ ทำให้ %20 กลายเป็น %2520 และเข้ารหัสค่าพารามิเตอร์ใน API call เสมอ เพราะ input ของ user อาจมีอะไรก็ได้

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

ทำไมต้อง URL encoding?

อักขระพิเศษใน URL (ช่องว่าง & = ฯลฯ) ต้องเข้ารหัสเพื่อตีความอย่างถูกต้อง

Percent encoding คืออะไร?

อักขระถูกแทนที่ด้วย %XX โดย XX คือค่าเลขฐานสิบหก

ควร encode URL ทั้งหมดไหม?

ไม่ ให้ encode เฉพาะค่าพารามิเตอร์ ไม่ใช่โครงสร้าง URL

เครื่องมือที่เกี่ยวข้อง