UltKit
รูปภาพ11
PDF13
เอกสารและข้อมูล7
วิดีโอ6
เสียง4
เครื่องมืออื่น ๆ22

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

ทำให้ข้อความใส่ใน URL ได้อย่างปลอดภัย หรือแปลงลำดับแบบ %20 กลับเป็นตัวอักษรที่อ่านได้ เครื่องมือนี้ใช้ encodeURIComponent, encodeURI และ decodeURIComponent ของเบราว์เซอร์คุณเอง แสดงพารามิเตอร์ query เป็นตาราง และไม่ส่งข้อมูลใดไปยังเซิร์ฟเวอร์

โหมด

0 ตัวอักษร · 0 คำ · 0 บรรทัด

0 ตัวอักษร · 0 คำ · 0 บรรทัด

ทำงานทั้งหมดภายในแท็บเบราว์เซอร์นี้ ข้อความของคุณจะไม่ถูกอัปโหลดหรือจัดเก็บไว้

แต่ละฟังก์ชัน escape อะไรบ้าง

คำนวณด้วยฟังก์ชันของเบราว์เซอร์เอง encodeURIComponent จะไม่แปลงตัวอักษร ตัวเลข และเครื่องหมายเหล่านี้: ! ' ( ) * - . _ ~

อักขระencodeURIComponentencodeURI
(ช่องว่าง)%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 ก่อนถอดรหัส