ลิงก์ภาษาไทยที่คัดลอกมาแล้วกลายเป็นเส้นยาวๆ แบบ %E0%B8%84%E0%B9%89%E0%B8%99%E0%B8%AB%E0%B8%B2 คือผลของการทำ URL Encode หรือการเข้ารหัสลิงก์ เพราะที่อยู่เว็บเขียนได้เฉพาะตัวอักษรชุดพื้นฐาน ตัวอักษรไทยจึงถูกแปลงเป็นรหัส ถ้าอยากรู้ว่ารหัสนั้นคือคำว่าอะไร ให้วางลงในเครื่องมือ URL Encode / Decodeแล้วกดถอดรหัส ข้อความไทยจะกลับมาให้อ่านทันที ทำในเบราว์เซอร์ของคุณเอง ไม่ต้องอัปโหลดอะไร ไม่ต้องลงโปรแกรม
บทความนี้อธิบายว่าทำไมถึงต้องเข้ารหัส ตัวอักษรไทยหนึ่งตัวกลายเป็นรหัสอะไร ใช้เครื่องมือยังไง และข้อควรระวังที่คนมักพลาด เช่น เครื่องหมาย + กับ %20 ต่างกันยังไง ตัวอย่างทุกบรรทัดในบทความคำนวณด้วยฟังก์ชันเดียวกับที่เครื่องมือใช้จริง
URL Encode คืออะไร
URL Encode หรือที่เรียกว่า Percent-encoding คือวิธีเขียนอักขระที่ไม่สามารถอยู่ใน URL ได้โดยตรงให้เป็นรหัสรูปแบบ % ตามด้วยเลขฐาน 16 สองหลัก เช่น ช่องว่างกลายเป็น %20 เครื่องหมาย & กลายเป็น %26 ตามมาตรฐาน RFC 3986 อักขระที่ใช้ได้ทุกตำแหน่งโดยไม่ต้องเข้ารหัส (กลุ่ม unreserved) มีแค่ตัวอักษรอังกฤษ ตัวเลข และเครื่องหมาย - . _ ~ ส่วนเครื่องหมายอย่าง / ? & = เขียนตรงๆ ได้เฉพาะตอนทำหน้าที่ของมันในโครงสร้างลิงก์ และอักขระอื่นทั้งหมด รวมถึงตัวอักษรไทย ต้องแปลงเป็นไบต์ UTF-8 ก่อน แล้วเขียนไบต์ละหนึ่งชุด %XX
ข้อควรรู้คือการเข้ารหัสแบบนี้ไม่ได้ทำให้ข้อมูลเป็นความลับ ใครก็ถอดกลับได้ เป็นแค่การเขียนให้ถูกรูปแบบเพื่อให้ลิงก์ส่งผ่านระบบต่างๆ ได้โดยไม่เพี้ยน
ทำไมตัวอักษรไทยหนึ่งตัวกลายเป็น 9 ตัวอักษร
ตัวอักษรไทยแต่ละตัวใช้ 3 ไบต์ใน UTF-8 และไบต์ละหนึ่งไบต์ถูกเขียนเป็น %XX (3 อักขระ) จึงได้ตัวอักษรไทย 1 ตัว = 3 ไบต์ = 9 อักขระ ตัวอย่างเช่น “ก” กลายเป็น %E0%B8%81 ตารางนี้คำนวณจากเครื่องมือจริง
| ข้อความ | ผลลัพธ์หลังเข้ารหัส | ไบต์ UTF-8 | ความยาวที่ได้ |
|---|---|---|---|
| ก | %E0%B8%81 |
3 | 9 อักขระ |
| ไทย | %E0%B9%84%E0%B8%97%E0%B8%A2 |
9 | 27 อักขระ |
| ค้นหา | %E0%B8%84%E0%B9%89%E0%B8%99%E0%B8%AB%E0%B8%B2 |
15 | 45 อักขระ |
| สวัสดี | %E0%B8%AA%E0%B8%A7%E0%B8%B1%E0%B8%AA%E0%B8%94%E0%B8%B5 |
18 | 54 อักขระ |
| แปลงไฟล์ | %E0%B9%81%E0%B8%9B%E0%B8%A5%E0%B8%87%E0%B9%84%E0%B8%9F%E0%B8%A5%E0%B9%8C |
24 | 72 อักขระ |
สังเกตว่า “ค้นหา” มี 5 ตัว (ค ้ น ห า) เพราะไม้โท ้ นับเป็นอักขระแยกหนึ่งตัว จึงได้ 15 ไบต์ ไม่ใช่ 12 ส่วนรหัส %E0%B8 และ %E0%B9 ที่เห็นซ้ำเกือบทุกตัวมาจากการที่ตัวอักษรไทยทั้งหมดอยู่ในช่วงรหัสใกล้กัน จึงขึ้นต้นด้วยไบต์ E0 เหมือนกัน
วิธีถอดรหัสลิงก์ภาษาไทย ทำยังไง
- คัดลอกลิงก์หรือข้อความที่เป็นรหัส เช่น
https://example.com/%E0%B8%84%E0%B9%89%E0%B8%99%E0%B8%AB%E0%B8%B2 - เปิดเครื่องมือ URL Encode / Decode แล้ววางลงในช่องบน
- กดปุ่ม ถอดรหัส (Decode)
- ผลลัพธ์จะขึ้นในช่องล่าง ได้
https://example.com/ค้นหากดคัดลอกผลลัพธ์ไปใช้ได้เลย
ถ้าวางลิงก์ทั้งเส้นที่มีทั้งส่วนภาษาไทยและส่วนอังกฤษ เครื่องมือจะแปลงเฉพาะส่วนที่เป็นรหัส ส่วนที่เป็นภาษาอังกฤษปกติจะคงเดิม ตัวอย่างการถอดรหัสลิงก์ที่มีคำค้นหา:
| ก่อนถอดรหัส | หลังถอดรหัส |
|---|---|
https://example.com/%E0%B8%84%E0%B9%89%E0%B8%99%E0%B8%AB%E0%B8%B2?q=%E0%B9%81%E0%B8%9B%E0%B8%A5%E0%B8%87%E0%B9%84%E0%B8%9F%E0%B8%A5%E0%B9%8C |
https://example.com/ค้นหา?q=แปลงไฟล์ |
วิธีเข้ารหัส (Encode) ให้ถูก ไม่ให้ลิงก์พัง
ขั้นตอนเข้ารหัสเหมือนกัน แต่กดปุ่ม เข้ารหัส (Encode) แทน จุดที่ต้องระวังคือเครื่องมือเข้ารหัสแบบ “ส่วนประกอบของ URL” (ตรงกับฟังก์ชัน encodeURIComponent ใน JavaScript) ซึ่งจะแปลงเครื่องหมายโครงสร้างลิงก์อย่าง : / ? = ด้วย ถ้าวางลิงก์ทั้งเส้น ผลที่ได้จะเป็นแบบนี้:
| สิ่งที่วาง | ผลลัพธ์ | นำไปใช้ |
|---|---|---|
ลิงก์ทั้งเส้น https://example.com/ค้นหา?q=แปลงไฟล์ |
https%3A%2F%2Fexample.com%2F%E0%B8%84... |
ใช้เป็นค่าพารามิเตอร์ในลิงก์อื่นได้ แต่เปิดเป็นลิงก์ตรงๆ ไม่ได้ |
เฉพาะส่วนไทย ค้นหา |
%E0%B8%84%E0%B9%89%E0%B8%99%E0%B8%AB%E0%B8%B2 |
นำไปต่อท้ายลิงก์ได้เลย |
สรุปวิธีที่ปลอดภัยที่สุดคือ เข้ารหัสเฉพาะส่วนที่เป็นภาษาไทยหรือคำค้นหา แล้วนำไปต่อเข้ากับส่วน https:// และ / ด้วยตัวเอง
เครื่องหมายพิเศษที่ถูกเข้ารหัสเมื่อเข้ารหัสแบบส่วนประกอบ
ตารางนี้คือผลของเครื่องมือจริงเมื่อเข้ารหัสแต่ละอักขระ เครื่องหมายที่มีหน้าที่พิเศษใน URL จะถูกแปลงเพื่อไม่ให้ไปปนกับโครงสร้างลิงก์
| อักขระ | ผลลัพธ์ | หน้าที่ใน URL |
|---|---|---|
| ช่องว่าง | %20 |
ไม่มี (ห้ามอยู่ใน URL) |
# |
%23 |
เริ่มส่วนอ้างอิงภายในหน้า |
? |
%3F |
เริ่มส่วนคำค้นหา (query) |
& |
%26 |
คั่นระหว่างพารามิเตอร์ |
= |
%3D |
คั่นชื่อกับค่าของพารามิเตอร์ |
/ |
%2F |
คั่นระดับโฟลเดอร์ |
: |
%3A |
คั่นโปรโตคอลหรือพอร์ต |
+ |
%2B |
ในแบบฟอร์มหมายถึงช่องว่าง |
% |
%25 |
ตัวนำหน้ารหัสเอง |
ส่วน - _ . ~ และ ! ' ( ) * เครื่องมือจะไม่แปลง เพราะเป็นอักขระที่ใช้ใน URL ได้อยู่แล้ว ตามรายการในเอกสาร MDN ของ encodeURIComponent
เมื่อไหร่ที่ต้องใช้ Encode หรือ Decode
- ส่งลิงก์ที่มีคำค้นหาภาษาไทย เช่น ลิงก์ผลค้นหาในเว็บ ถ้าเข้ารหัสไว้ก่อนจะไม่เพี้ยนเมื่อผ่านแชทหรืออีเมล
- ตั้งค่าพารามิเตอร์ใน API หรือสคริปต์ ที่รับค่าภาษาไทย ต้องเข้ารหัสทุกครั้งก่อนต่อเข้า URL
- เปิดอ่านลิงก์ที่ได้มาเป็นรหัส เช่น จากรายงาน Analytics หรือล็อกเซิร์ฟเวอร์ ใช้ถอดรหัสให้รู้ว่าผู้ใช้ค้นหาหรือเข้าหน้าอะไร
- ตรวจสอบลิงก์ก่อนกด ถ้าลิงก์ยาวผิดปกติ ถอดรหัสดูก่อนว่าปลายทางคืออะไร
ข้อควรระวังที่คนมักพลาด
เครื่องหมาย + กับ %20 ไม่เหมือนกันเสมอไป
มาตรฐาน URL ทั่วไปเขียนช่องว่างเป็น %20 แต่รูปแบบข้อมูลฟอร์มเว็บ (application/x-www-form-urlencoded) นิยมใช้ + แทนช่องว่าง เครื่องมือนี้ตอนถอดรหัสจะแปลง + เป็นช่องว่างให้ ดังนั้นลิงก์ pee+chong%202569 จะถอดได้ pee chong 2569 แต่ถ้าข้อมูลของคุณมี + จริงๆ เช่น 1+1 เครื่องมือจะถอดได้ 1 1 ตอนเข้ารหัสเครื่องมือเขียน + เป็น %2B ซึ่งถอดกลับได้ถูกต้อง
เข้ารหัสซ้ำสองรอบ
ถ้าเข้ารหัสสิ่งที่เข้ารหัสแล้วอีกรอบ เครื่องหมาย % จะถูกแปลงเป็น %25 ทำให้ “ก” กลายเป็น %25E0%25B8%2581 ซึ่งถอดครั้งเดียวจะได้ %E0%B8%81 ไม่ใช่ตัวอักษรไทย อาการนี้คือสัญญาณว่าลิงก์ถูกเข้ารหัสซ้ำ ให้กดถอดรหัสอีกครั้ง
ถอดรหัสแล้วขึ้นว่า “ถอดรหัสไม่ได้”
ข้อความนี้ขึ้นเมื่อรหัสไม่สมบูรณ์ ที่พบบ่อยมี 3 แบบ ได้แก่ คัดลอกมาไม่ครบ เช่นขาดไบต์ท้าย (%E0%B8 มีไม่ครบ 3 ไบต์ของตัวอักษรไทยหนึ่งตัว) มีเครื่องหมาย % อยู่เฉยๆ เช่นข้อความ 100% หรือ % ตามด้วยตัวอักษรที่ไม่ใช่เลขฐาน 16 เช่น %ZZ ทั้งสามกรณีเป็น URI malformed ใน JavaScript ให้ตรวจว่าคัดลอกครบและไม่มี % ที่ไม่ใช่รหัส
ชื่อโดเมนภาษาไทยไม่ใช้ %E0%B8
เรื่องนี้สับสนบ่อย ส่วนที่เข้ารหัสด้วย %XX คือส่วนพาธและคำค้นหาหลังชื่อโดเมน ส่วน ชื่อโดเมนภาษาไทย ใช้ระบบอื่นเรียกว่า Punycode ขึ้นต้นด้วย xn-- เช่น “แปลงไฟล์” ที่เป็นชื่อโดเมนของเว็บนี้ คือ xn--72c3bnwc7nya0e ดังนั้นถ้าเห็น xn-- ในลิงก์ นั่นคือชื่อโดเมน ไม่ใช่ส่วนที่ถอดด้วยเครื่องมือ URL Decode
ความปลอดภัยและความเป็นส่วนตัว
เครื่องมือทำงานในเบราว์เซอร์ของคุณทั้งหมด ข้อความที่วางไม่ถูกส่งไปที่เซิร์ฟเวอร์ แต่ขอเตือนว่าลิงก์ที่มีรหัสเข้าสู่ระบบหรือโทเค็นต่อท้าย ไม่ควรแชร์ต่อ แม้จะถอดรหัสแล้วหรือไม่ก็ตาม เพราะรหัสเหล่านั้นยังใช้งานได้เหมือนเดิม
เรื่องที่เกี่ยวข้อง
รหัส %XX ก็คือเลขฐาน 16 ซึ่งอ่านเพิ่มได้ในเลขฐาน 2 8 10 16 คืออะไร แปลงเลขฐานยังไง ส่วนใครที่ทำงานกับข้อมูลที่ต้องเข้ารหัสอีกแบบ อ่านต่อได้ที่Base64 คืออะไร ใช้ทำอะไรได้บ้าง และJSON คืออะไร ทำไมต้องจัดรูปแบบ หรือถ้าสนใจรหัสสีแบบ HEX ในงานเว็บ ดูรหัสสี HEX RGB HSL ต่างกันยังไง
คำถามที่พบบ่อย
URL Encode คืออะไร
คือการแปลงอักขระที่ใช้ใน URL ไม่ได้โดยตรง เช่น ช่องว่างและตัวอักษรไทย ให้เป็นรหัสแบบ %XX เพื่อให้ลิงก์ส่งผ่านระบบต่างๆ ได้ถูกต้อง
ทำไมลิงก์ภาษาไทยถึงกลายเป็น %E0%B8
เพราะ URL เขียนได้เฉพาะชุดอักขระพื้นฐาน ตัวอักษรไทยจึงถูกแปลงเป็นไบต์ UTF-8 แล้วเขียนไบต์ละหนึ่งชุด %XX ตัวอักษรไทยเกือบทุกตัวขึ้นต้นด้วย %E0%B8 หรือ %E0%B9
ตัวอักษรไทยหนึ่งตัวกลายเป็นกี่อักขระ
9 อักขระ เพราะตัวอักษรไทยใช้ 3 ไบต์ใน UTF-8 และแต่ละไบต์เขียนเป็น %XX ยาว 3 อักขระ
%20 กับ + ต่างกันยังไง
ทั้งสองแทนช่องว่าง แต่ %20 เป็นรูปแบบมาตรฐานของ URL ส่วน + ใช้ในข้อมูลฟอร์มเว็บ เครื่องมือนี้ถอดรหัส + เป็นช่องว่างและเข้ารหัสช่องว่างเป็น %20
ลิงก์ที่เข้ารหัสแล้วเปิดได้เหมือนเดิมไหม
ได้ ลิงก์ที่เป็นรหัสกับลิงก์ภาษาไทยชี้ไปที่เดียวกัน เบราว์เซอร์และเซิร์ฟเวอร์ถอดรหัสให้เอง เพียงแต่แบบที่เข้ารหัสแล้วอ่านยากสำหรับคน
เครื่องมือเก็บข้อความที่ฉันวางไว้ไหม
ไม่ ทุกอย่างทำงานในเบราว์เซอร์ของคุณ ไม่มีการส่งหรือบันทึกข้อมูลไปที่เซิร์ฟเวอร์
สรุป
URL Encode คือการเขียนอักขระที่ URL ไม่รองรับให้อยู่ในรูป %XX ตัวอักษรไทยหนึ่งตัวกลายเป็น 9 อักขระเพราะใช้ 3 ไบต์ใน UTF-8 วิธีใช้คือวางลิงก์ลงในช่องแล้วกดถอดรหัสเมื่ออยากอ่าน หรือกดเข้ารหัสเมื่ออยากส่งคำค้นหาภาษาไทยใน URL อย่าลืมเข้ารหัสเฉพาะส่วนที่ต้องการ ระวังเครื่องหมาย + และการเข้ารหัสซ้ำ พร้อมแล้วลองURL Encode / Decode ออนไลน์ฟรีได้เลย
แหล่งอ้างอิง: RFC 3986 (Uniform Resource Identifier: Generic Syntax) หัวข้อ Percent-Encoding และ Unreserved Characters, MDN Web Docs (encodeURIComponent และ encodeURI), WHATWG URL Standard (application/x-www-form-urlencoded) ตัวอย่างและตารางทั้งหมดคำนวณด้วยฟังก์ชัน encodeURIComponent และ decodeURIComponent ที่เครื่องมือใช้จริง