เข้ารหัสและถอดรหัส URL
ทำให้ข้อความใส่ใน URL ได้อย่างปลอดภัย หรือแปลงลำดับแบบ %20 กลับเป็นตัวอักษรที่อ่านได้ เครื่องมือนี้ใช้ encodeURIComponent, encodeURI และ decodeURIComponent ของเบราว์เซอร์คุณเอง แสดงพารามิเตอร์ query เป็นตาราง และไม่ส่งข้อมูลใดไปยังเซิร์ฟเวอร์
0 ตัวอักษร · 0 คำ · 0 บรรทัด
0 ตัวอักษร · 0 คำ · 0 บรรทัด
ทำงานทั้งหมดภายในแท็บเบราว์เซอร์นี้ ข้อความของคุณจะไม่ถูกอัปโหลดหรือจัดเก็บไว้
แต่ละฟังก์ชัน escape อะไรบ้าง
คำนวณด้วยฟังก์ชันของเบราว์เซอร์เอง encodeURIComponent จะไม่แปลงตัวอักษร ตัวเลข และเครื่องหมายเหล่านี้: ! ' ( ) * - . _ ~
| อักขระ | encodeURIComponent | encodeURI |
|---|---|---|
(ช่องว่าง) | %20 | %20 |
! | ! | ! |
" | %22 | %22 |
# | %23 | # |
$ | %24 | $ |
% | %25 | %25 |
& | %26 | & |
' | ' | ' |
( | ( | ( |
) | ) | ) |
* | * | * |
+ | %2B | + |
, | %2C | , |
/ | %2F | / |
: | %3A | : |
; | %3B | ; |
= | %3D | = |
? | %3F | ? |
@ | %40 | @ |
[ | %5B | %5B |
] | %5D | %5D |
{ | %7B | %7B |
} | %7D | %7D |
| | %7C | %7C |
\ | %5C | %5C |
^ | %5E | %5E |
` | %60 | %60 |
< | %3C | %3C |
> | %3E | %3E |
~ | ~ | ~ |
- | - | - |
_ | _ | _ |
. | . | . |
é | %C3%A9 | %C3%A9 |
€ | %E2%82%AC | %E2%82%AC |
😀 | %F0%9F%98%80 | %F0%9F%98%80 |
Percent-encoding และอักขระสงวนตาม RFC 3986
URL มีอักขระ ASCII ได้เพียงชุดจำกัด RFC 3986 ซึ่งเป็นข้อกำหนดไวยากรณ์ของ URI ฉบับปี 2005 แบ่งอักขระออกเป็นสองกลุ่ม กลุ่ม unreserved ได้แก่ A–Z, a–z, 0–9 และเครื่องหมายสี่ตัว - . _ ~ ไม่ต้องเข้ารหัสเลย ส่วนกลุ่ม reserved มีหน้าที่เฉพาะ โดย general delimiters : / ? # [ ] @ ใช้คั่น scheme, host, path, query และ fragment ส่วน sub-delimiters ! $ & ' ( ) * + , ; = ใช้คั่นรายการภายในส่วนเหล่านั้น เช่น & และ = ในสตริง query ส่วนอักขระอื่นทั้งหมด รวมถึงอักขระ reserved ที่ใช้เป็นข้อมูลธรรมดา ต้องเข้ารหัสแบบ percent-encoding
Percent-encoding เขียนไบต์เป็นเครื่องหมาย % ตามด้วยเลขฐานสิบหกสองหลัก ข้อความจะถูกแปลงเป็น UTF-8 ก่อน ช่องว่างจึงกลายเป็น %20, ตัว é (สองไบต์) กลายเป็น %C3%A9 และอีโมจิกลายเป็นกลุ่ม %XX สี่กลุ่ม ด้วยเหตุนี้การค้นหา "café & bar" จึงปรากฏในลิงก์เป็น caf%C3%A9%20%26%20bar โดย & ถูกเข้ารหัสเพื่อไม่ให้เซิร์ฟเวอร์เข้าใจว่าเป็นจุดเริ่มต้นของพารามิเตอร์ใหม่
encodeURIComponent, encodeURI และการถอดรหัส
encodeURIComponent เหมาะกับส่วนย่อยเพียงส่วนเดียว เช่น ค่าใน query, ส่วนของ path หรือ URL สำหรับ redirect ที่ส่งเป็นพารามิเตอร์ ฟังก์ชันนี้เข้ารหัสทุกอย่างยกเว้นอักขระ unreserved และ ! ' ( ) * ซึ่ง JavaScript เว้นไว้ด้วยเหตุผลทางประวัติศาสตร์ ส่วน encodeURI (whole URL) ถือว่าอินพุตเป็นที่อยู่ที่สมบูรณ์อยู่แล้วและคงอักขระ reserved ไว้ ดังนั้น https://example.com/a b?q=1 จะเข้ารหัสเฉพาะช่องว่างเท่านั้น การใช้ encodeURI กับค่าพารามิเตอร์เป็นข้อผิดพลาดที่พบบ่อย เพราะ & หรือ # ในค่านั้นจะไม่ถูกเข้ารหัสและทำให้ URL เสีย
Decode ย้อนกลับได้ทั้งสองฟังก์ชัน ฟอร์ม HTML ที่ส่งด้วย GET ใช้รูปแบบ application/x-www-form-urlencoded แบบเก่า ซึ่งเขียนช่องว่างเป็น + แทน %20 ให้เลือก Treat + as a space ไว้สำหรับกรณีนั้น และยกเลิกเมื่อเครื่องหมายบวกจริงมีความหมาย เช่น ในเบอร์โทรศัพท์ หากอินพุตมี % ที่ไม่ได้ตามด้วยเลขฐานสิบหกสองหลัก หรือมีไบต์ที่ไม่ใช่ UTF-8 ที่ถูกต้อง การถอดรหัสจะล้มเหลวพร้อมข้อความที่ชัดเจนแทนการเดา เมื่อข้อความมีสตริง query พารามิเตอร์จะแสดงในรูปที่ถอดรหัสแล้วในตารางใต้เครื่องมือ สำหรับข้อมูลไบนารีใน URL ทางเลือกที่นิยมคือ Base64url
คำถามที่พบบ่อย
- ช่องว่างใน URL ควรเป็น %20 หรือเครื่องหมายบวก
- ใน path และตามนิยามของ RFC 3986 ช่องว่างคือ %20 ส่วนรูปแบบ + หมายถึงช่องว่างเฉพาะใน query string ที่เข้ารหัสแบบเดียวกับฟอร์ม HTML เท่านั้น ดังนั้น %20 จึงปลอดภัยที่สุดในทุกกรณี
- ทำไม URL ของฉันจึงมี %2520 อยู่
- เพราะถูกเข้ารหัสสองครั้ง รอบแรกเปลี่ยนช่องว่างเป็น %20 และรอบที่สองเข้ารหัสตัว % เองเป็น %25 ให้ถอดรหัสหนึ่งครั้งเพื่อยกเลิกชั้นที่เกินมา และเข้ารหัสค่าเพียงจุดเดียวในโค้ดของคุณ
- อักขระใดบ้างที่ไม่ต้องเข้ารหัสแบบ percent-encoding เลย
- ชุด unreserved ของ RFC 3986 ได้แก่ ตัวอักษร A ถึง Z ทั้งพิมพ์ใหญ่และพิมพ์เล็ก ตัวเลข 0 ถึง 9 และเครื่องหมายยัติภังค์ จุด ขีดล่าง และทิลดา
- URL มีตัวอักษรที่ไม่ใช่ภาษาอังกฤษโดยไม่เข้ารหัสได้หรือไม่
- เบราว์เซอร์จะแสดงอักขระเหล่านั้นตามปกติ แต่ในการส่งจริง อักขระที่ไม่ใช่ ASCII ทุกตัวใน path หรือ query จะถูกส่งเป็น UTF-8 แบบ percent-encoded ส่วนชื่อโดเมนใช้ระบบแยกต่างหากคือ Punycode ซึ่งแปลงเป็นป้ายที่ขึ้นต้นด้วย xn--
- ทำไมการถอดรหัสจึงแจ้งว่าลำดับอักขระไม่ถูกต้อง
- ข้อความมี % ที่ไม่ได้ตามด้วยเลขฐานสิบหกสองหลัก เช่น "100%" ที่เป็นตัวอักษรจริง หรือไบต์ถอดรหัสเป็น UTF-8 ที่ไม่ถูกต้อง ให้เข้ารหัส % ที่เหลืออยู่เป็น %25 ก่อนถอดรหัส