URL เข้ารหัสอักขระช่องว่าง: + หรือ% 20


723

ช่องว่างใน URL จะถูกเข้ารหัส+เมื่อใดและจะมีการเข้ารหัสเมื่อ%20ใด


2
คำถามนี้จะมีประโยชน์มากขึ้นสำหรับคำถามเฉพาะหลายภาษาใช่ไหม
squarecandy

2
มีความเป็นไปได้ที่ซ้ำกันของเมื่อจะเข้ารหัสพื้นที่เป็นบวก (+) หรือ% 20
ผู้ใช้

3
@user คำถามที่คุณเชื่อมโยงไปยังถูกถามในภายหลังทำให้เป็นคนล่อลวงไม่ใช่คนนี้
Chimpanzee Warlike

คำตอบ:


425

จากWikipedia (เน้นและเพิ่มลิงค์):

เมื่อข้อมูลที่ป้อนลงในแบบฟอร์ม HTML ถูกส่งชื่อและค่าของแบบฟอร์มฟิลด์จะถูกเข้ารหัสและส่งไปยังเซิร์ฟเวอร์ในข้อความคำขอ HTTP โดยใช้วิธีการ GET หรือ POST หรือประวัติผ่านทางอีเมล การเข้ารหัสที่ใช้เป็นค่าเริ่มต้นจะยึดตามกฎการเข้ารหัสเปอร์เซ็นต์ URI ทั่วไปรุ่นแรก ๆ โดยมีการปรับเปลี่ยนจำนวนมากเช่นการปรับบรรทัดใหม่และการแทนที่ช่องว่างด้วย "+" แทน "% 20" ข้อมูลประเภท MIME ที่เข้ารหัสด้วยวิธีนี้คือ application / x-www-form-urlencoded และปัจจุบันได้รับการกำหนด (ยังอยู่ในลักษณะล้าสมัยมาก) ในข้อกำหนด HTML และ XForms

ดังนั้นจริงร้อยละเข้ารหัสการใช้งาน%20ในขณะที่ข้อมูลในรูปแบบ URL +ที่อยู่ในรูปแบบการแก้ไขที่ใช้ ดังนั้นคุณมักจะเห็นเฉพาะ+ใน URL ?ในสตริงแบบสอบถามหลัง


2
ดังนั้นการเข้ารหัส + จะเป็นการเข้ารหัสแบบหลายส่วน / แบบฟอร์มข้อมูลในขณะที่การเข้ารหัสแบบเปอร์เซ็นต์คือแอปพลิเคชัน / x-www-form-urlencoded
พศ.

17
@BC: ไม่ - multipart/form-dataใช้การเข้ารหัส MIME; application/x-www-form-urlencodedการใช้งาน+และการเข้ารหัส URI %20ที่ต้องใช้
McDowell

8
"ดังนั้นคุณน่าจะเห็นเพียง + ใน URL ในสตริงการสืบค้นหลังจาก?" เป็นการพูดน้อย คุณไม่ควรเห็น "+" ในส่วนเส้นทางของ URL เพราะจะไม่ทำสิ่งที่คุณคาดหวัง (ช่องว่าง)
Adam Gent

34
ดังนั้นโดยทั่วไป: เป้าหมายของการส่ง GET คือhttp://www.bing.com/search?q=hello+worldและทรัพยากรที่มีช่องว่างในชื่อhttp://camera.phor.net/cameralife/folders/2012/2012-06%20Pool%20party/
William Entriken

8
โปรดทราบว่าสำหรับลิงก์อีเมลคุณต้องการ% 20 ไม่ใช่ + หลัง? ตัวอย่างเช่นmailto:support@example.org?subject=I%20need%20help. หากคุณลองใช้ด้วย + อีเมลจะเปิดด้วย + es แทนที่จะเว้นวรรค
Sygmoral

287

ความสับสนนี้เป็นเพราะ 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ก่อน?และ+หลัง

แหล่ง


>> คุณควรจะได้% 20 ก่อนหน้า? และ + หลังจากขออภัยสำหรับคำถามโง่ ๆ ฉันรู้เล็กน้อยว่าพารามิเตอร์ hashtag ถูกใช้หลังจาก "?" พารามิเตอร์เครื่องหมายคำถาม แม้ว่ามันจะแตกต่างออกไปเพราะการใช้ "#" จะไม่โหลดหน้าซ้ำ แต่ฉันพยายามใช้เครื่องหมาย% 20 และ + หลังจากแฮชแท็ก "#" และดูเหมือนว่าจะไม่ทำงาน ต้องใช้อันไหนหลังจาก "#"
Philcyb

@Philcyb คุณอาจต้องการอ่านen.wikipedia.org/wiki/Percent-encoding
Matas Vaitkevicius

ส่วนแบบสอบถามมีมาตรฐาน "เป็นทางการ" จริงหรือไม่ ฉันคิดว่าส่วนนั้นเป็นแอพพลิเคชั่นเฉพาะ แอพ 99.99% ใช้ในkey1=value1&key1=value2ที่ที่มีการเข้ารหัสคีย์และค่าencodeURIComponentตามกฎใด ๆ ก็ตามแต่ AFAIK เนื้อหาของส่วนของแบบสอบถามจะเป็น 100% ขึ้นอยู่กับแอพทั้งหมด อื่น ๆ จากนั้นไปที่แรก#เท่านั้นไม่มีการเข้ารหัสอย่างเป็นทางการ
gman

คำตอบที่ซ้ำกันสำหรับคำถามที่ซ้ำกัน! แต่อืมโอเคฉันยอมแพ้ทั้งคู่
Vladimir Vukanac

3
การติดฉลากองค์ประกอบ ASCII นั้นยิ่งใหญ่
jsejcksn

25

%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+'

ไม่ใช่การเข้ารหัส พยายามระบุจากมุมมองด้านสุนทรียภาพว่า URL ของฉันที่มีช่องว่างเป็นอย่างไร
พศ.

สวัสดีฉันก็สับสนเช่นกันเมื่อผู้ใช้ส่งแบบฟอร์ม html วิธีการเข้ารหัสพื้นที่? ตัวละครไหน ผลลัพธ์ขึ้นอยู่กับเบราว์เซอร์หรือไม่
GMsoF

1
และURLEncoder.encode()วิธีการใน Java จะแปลง+เป็นเช่นกัน
рüффп

จากนั้นคำถามก็เกิดขึ้นกับวิธีการเข้ารหัสในเนื้อหาของคำขอ POST: "Content-Type: application / x-www-form-urlencoded" โดยที่พารามิเตอร์อยู่ในรูปแบบของ "a = b & c = d", แต่ไม่ได้อยู่ใน URL เลยเพียงส่วนของ "เอกสาร" พวกเขาสร้างความยุ่งเหยิงจากปัญหานี้และมันก็ยากที่จะหาคำตอบที่ชัดเจน
fyngyrz

Perls uri_escape () ถือว่าพวกเขาเป็น 20%
someuser

16

พื้นที่อาจถูกเข้ารหัสเป็น "+" ใน "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 ก่อนแล้วจึงเข้ารหัสเปอร์เซ็นต์ผลลัพธ์


1
ทำไมทุกคนควรสนใจข้อมูลจำเพาะ HTML หากทรัพยากรที่ร้องขอไม่ใช่ HTML ฉันเห็น "+" ในบาง Web API ที่ไม่ตอบสนองกับ HTML เช่นคุณขอ PDF ฉันคิดว่ามันผิดที่พวกเขาไม่ได้ใช้ "% 20"
เหลือเชื่อ Jan

@TheincredibleJan ฉันเห็นด้วยกับคุณ นั่นคือสิ่งที่ฉันตอบเกี่ยวกับ
Maxim Masiutin

1
@MaximMasiutin เมื่อคำตอบของคุณบอกว่า "นี่คือ MAY ไม่ใช่ MUST" ซึ่งเป็นสเป็คที่คุณอ้างถึง? ฉันดิ้นรนเพื่อหาข้อมูลจำเพาะที่เป็นไปได้ ในw3.org/TR/1999/REC-html401-19991224/interact/…ใช้ '+' (ในส่วนของการสืบค้น) อยู่ภายในส่วน 'ต้อง' ของข้อมูลจำเพาะ
JosephH

2
@JosephH - ขอบคุณสำหรับบันทึกย่อของคุณ มันเป็นความคิดเห็นแบบถาวรของฉันเกี่ยวกับ MAY ฉันแก้ไขโพสต์แล้ว สิ่งที่ฉันหมายถึงคือข้อกำหนด HTML ที่คุณได้กำหนด "+" แต่ในบริบท URL จะมีการใช้กฎอื่นซึ่งอนุญาตให้มีการเข้ารหัสช่องว่างด้วยเช่น% 20
Maxim Masiutin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.