ช่องว่างใน URL จะถูกเข้ารหัส+
เมื่อใดและจะมีการเข้ารหัสเมื่อ%20
ใด
ช่องว่างใน URL จะถูกเข้ารหัส+
เมื่อใดและจะมีการเข้ารหัสเมื่อ%20
ใด
คำตอบ:
จากWikipedia (เน้นและเพิ่มลิงค์):
เมื่อข้อมูลที่ป้อนลงในแบบฟอร์ม HTML ถูกส่งชื่อและค่าของแบบฟอร์มฟิลด์จะถูกเข้ารหัสและส่งไปยังเซิร์ฟเวอร์ในข้อความคำขอ HTTP โดยใช้วิธีการ GET หรือ POST หรือประวัติผ่านทางอีเมล การเข้ารหัสที่ใช้เป็นค่าเริ่มต้นจะยึดตามกฎการเข้ารหัสเปอร์เซ็นต์ URI ทั่วไปรุ่นแรก ๆ โดยมีการปรับเปลี่ยนจำนวนมากเช่นการปรับบรรทัดใหม่และการแทนที่ช่องว่างด้วย "+" แทน "% 20" ข้อมูลประเภท MIME ที่เข้ารหัสด้วยวิธีนี้คือ application / x-www-form-urlencoded และปัจจุบันได้รับการกำหนด (ยังอยู่ในลักษณะล้าสมัยมาก) ในข้อกำหนด HTML และ XForms
ดังนั้นจริงร้อยละเข้ารหัสการใช้งาน%20
ในขณะที่ข้อมูลในรูปแบบ URL +
ที่อยู่ในรูปแบบการแก้ไขที่ใช้ ดังนั้นคุณมักจะเห็นเฉพาะ+
ใน URL ?
ในสตริงแบบสอบถามหลัง
multipart/form-data
ใช้การเข้ารหัส MIME; application/x-www-form-urlencoded
การใช้งาน+
และการเข้ารหัส URI %20
ที่ต้องใช้
http://www.bing.com/search?q=hello+world
และทรัพยากรที่มีช่องว่างในชื่อhttp://camera.phor.net/cameralife/folders/2012/2012-06%20Pool%20party/
mailto:support@example.org?subject=I%20need%20help
. หากคุณลองใช้ด้วย + อีเมลจะเปิดด้วย + es แทนที่จะเว้นวรรค
ความสับสนนี้เป็นเพราะ URL ยังคง 'เสีย' จนถึงทุกวันนี้
ยกตัวอย่างเช่น" http://www.google.com " นี่คือ URL URL เป็น Uniform Resource Locator และเป็นตัวชี้ไปยังหน้าเว็บ (ในกรณีส่วนใหญ่) ที่จริงแล้ว URL มีโครงสร้างที่ชัดเจนเป็นอย่างมากนับตั้งแต่สเปคครั้งแรกในปี 1994
เราสามารถดึงข้อมูลโดยละเอียดเกี่ยวกับURL " http://www.google.com ":
+---------------+-------------------+
| Part | Data |
+---------------+-------------------+
| Scheme | http |
| Host | www.google.com |
+---------------+-------------------+
หากเราดู URL ที่ซับซ้อนเช่น:
" https: // bob: bobby@www.lunatech.com: 8080 / ไฟล์; p = 1? q = 2 # สาม "
เราสามารถดึงข้อมูลต่อไปนี้:
+-------------------+---------------------+
| Part | Data |
+-------------------+---------------------+
| Scheme | https |
| User | bob |
| Password | bobby |
| Host | www.lunatech.com |
| Port | 8080 |
| Path | /file;p=1 |
| Path parameter | p=1 |
| Query | q=2 |
| Fragment | third |
+-------------------+---------------------+
https://bob:bobby@www.lunatech.com:8080/file;p=1?q=2#third
\___/ \_/ \___/ \______________/ \__/\_______/ \_/ \___/
| | | | | | \_/ | |
Scheme User Password Host Port Path | | Fragment
\_____________________________/ | Query
| Path parameter
Authority
อักขระที่สงวนไว้แตกต่างกันไปในแต่ละส่วน
สำหรับ HTTP URL พื้นที่ในส่วนแฟรกเมนต์ของพา ธ ต้องเข้ารหัสเป็น "% 20" (ไม่ใช่ไม่ใช่ "+" อย่างแน่นอน) ในขณะที่อักขระ "+" ในส่วนแฟรกเมนต์ของพา ธ สามารถไม่มีการเข้ารหัสได้
ในส่วนของแบบสอบถามช่องว่างอาจถูกเข้ารหัสเป็น "+" (สำหรับความเข้ากันได้แบบย้อนหลัง: อย่าพยายามค้นหาในมาตรฐาน URI) หรือ "% 20" ในขณะที่อักขระ "+" (เนื่องจากความกำกวมนี้ ) จะต้องถูกหลบหนีไปที่ "% 2B"
ซึ่งหมายความว่าสตริง "สีน้ำเงิน + สีฟ้าอ่อน" จะต้องเข้ารหัสแตกต่างกันในเส้นทางและส่วนแบบสอบถาม:
" http://example.com/blue+light%20blue?blue%2Blight+blue "
จากตรงนั้นคุณสามารถอนุมานได้ว่าการเข้ารหัส URL ที่สร้างขึ้นอย่างสมบูรณ์นั้นเป็นไปไม่ได้หากไม่มีการรับรู้เกี่ยวกับโครงสร้างของ URL
สิ่งนี้ทำให้เดือดลงไปที่:
คุณควรมี%20
ก่อน?
และ+
หลัง
key1=value1&key1=value2
ที่ที่มีการเข้ารหัสคีย์และค่าencodeURIComponent
ตามกฎใด ๆ ก็ตามแต่ AFAIK เนื้อหาของส่วนของแบบสอบถามจะเป็น 100% ขึ้นอยู่กับแอพทั้งหมด อื่น ๆ จากนั้นไปที่แรก#
เท่านั้นไม่มีการเข้ารหัสอย่างเป็นทางการ
%20
ฉันจะแนะนำ
คุณเข้ารหัสยากไหม
แม้ว่ามันจะไม่สอดคล้องกันมากในภาษาต่างๆ ถ้าผมไม่ผิดใน PHP urlencode()
พื้นที่ถือว่าเป็น+
ขณะที่งูใหญ่ถือว่าพวกเขาเป็นurlencode()
%20
แก้ไข:
ดูเหมือนว่าฉันเข้าใจผิด Python urlencode()
(อย่างน้อยใน 2.7.2) ใช้quote_plus()
แทนquote()
ดังนั้นจึงเข้ารหัสช่องว่างเป็น "+" ดูเหมือนว่าคำแนะนำ W3C คือ "+" ตามที่นี่: http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
และในความเป็นจริงคุณสามารถทำตามนี้การอภิปรายที่น่าสนใจใน ธ ติดตามปัญหาของตัวเองเกี่ยวกับสิ่งที่จะใช้ในการเข้ารหัสช่องว่าง: http://bugs.python.org/issue13866
แก้ไข # 2:
ฉันเข้าใจว่าวิธีการเข้ารหัสที่พบมากที่สุด "" เป็น "+" แต่เป็นเพียงข้อสังเกตมันอาจเป็นเพียงฉัน แต่ฉันพบว่ามันสับสนเล็กน้อย:
import urllib
print(urllib.urlencode({' ' : '+ '})
>>> '+=%2B+'
URLEncoder.encode()
วิธีการใน Java จะแปลง+
เป็นเช่นกัน
พื้นที่อาจถูกเข้ารหัสเป็น "+" ใน "application / x-www-form-urlencoded" คู่ของคีย์ - ค่าชนิดเนื้อหาของคู่แบบสอบถามของ URL ในความคิดของฉันนี่คืออาจไม่ใช่ต้อง ในส่วนที่เหลือของ URL จะถูกเข้ารหัสเป็น% 20
ในความคิดของฉันดีกว่าที่จะเข้ารหัสช่องว่างเป็น% 20 เสมอไม่ใช่ "+" แม้ในส่วนของ URL เพราะเป็นข้อกำหนด HTML (RFC-1866) ที่ระบุว่าอักขระช่องว่างควรเข้ารหัสเป็น " + "in" application / x-www-form-urlencoded "คู่ของคีย์ - ค่าประเภทเนื้อหา (ดูย่อหน้า 8.2.1. อนุวรรค 1)
วิธีการเข้ารหัสข้อมูลในแบบฟอร์มนี้จะได้รับในข้อกำหนดคุณสมบัติ HTML ในภายหลัง ตัวอย่างเช่นค้นหาย่อหน้าที่เกี่ยวข้องเกี่ยวกับ application / x-www-form-urlencoded ในข้อมูลจำเพาะ HTML 4.01 และอื่น ๆ
นี่คือสตริงตัวอย่างใน URL ที่ข้อกำหนด HTML อนุญาตให้มีการเข้ารหัสช่องว่างเป็นข้อดี: " http://example.com/over/there?name=foo+bar " ดังนั้นเฉพาะหลังจากที่ "?" ช่องว่างที่จะถูกแทนที่ด้วย pluses ในกรณีอื่น ๆ ช่องว่างควรถูกเข้ารหัสเป็น% 20 แต่เนื่องจากเป็นการยากที่จะระบุบริบทอย่างถูกต้องจึงเป็นวิธีปฏิบัติที่ดีที่สุดที่จะไม่เข้ารหัสช่องว่างเป็น "+"
ฉันขอแนะนำให้เข้ารหัสเปอร์เซ็นต์อักขระทั้งหมดยกเว้น "unreserved" ที่กำหนดใน RFC-3986, p.2.3
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
การใช้งานขึ้นอยู่กับภาษาการเขียนโปรแกรมที่คุณเลือก
หาก URL ของคุณมีอักขระประจำชาติให้เข้ารหัสเป็น UTF-8 ก่อนแล้วจึงเข้ารหัสเปอร์เซ็นต์ผลลัพธ์