พื้นที่ html แสดงเป็น% 2520 แทนที่จะเป็น% 20


110

ผ่านชื่อไฟล์เบราว์เซอร์ Firefox ทำให้เกิดการเปลี่ยนการเว้นวรรคแทน%2520 %20

ฉันมี HTML ต่อไปนี้ในไฟล์ชื่อmyhtml.html:

<img src="C:\Documents and Settings\screenshots\Image01.png"/>

พอโหลดmyhtml.htmlเข้า firefox ภาพจะขึ้นเป็นภาพเสีย ดังนั้นฉันจึงคลิกขวาที่ลิงค์เพื่อดูภาพและมันแสดง URL ที่แก้ไขนี้:

file:///c:/Documents%2520and%2520Settings/screenshots/Image01.png
                    ^
                    ^-----Firefox changed my space to %2520.

ห่า? มันแปลงพื้นที่ของฉันเป็นไฟล์%2520. ไม่ควรแปลงเป็น a %20?

ฉันจะเปลี่ยนไฟล์ HTML นี้เพื่อให้เบราว์เซอร์ค้นหารูปภาพของฉันได้อย่างไร เกิดอะไรขึ้นที่นี่?

คำตอบ:


219

คำอธิบายเล็กน้อยว่านั่น%2520คืออะไร:

อักขระช่องว่างทั่วไปถูกเข้ารหัสตาม%20ที่คุณสังเกตเห็น ตัวละครจะถูกเข้ารหัสเป็น%%25

วิธีที่คุณจะได้รับ%2520คือเมื่อ URL ของคุณมีอยู่แล้ว%20ในนั้นและได้รับ urlencoded อีกครั้งที่เปลี่ยนไป%20%2520

คุณ (หรือเฟรมเวิร์กที่คุณอาจใช้) เข้ารหัสอักขระสองครั้งหรือไม่?

แก้ไข: ขยายความเกี่ยวกับสิ่งนี้โดยเฉพาะสำหรับลิงก์LOCAL สมมติว่าคุณต้องการเชื่อมโยงไปยังทรัพยากรC:\my path\my file.html:

  • หากคุณระบุพา ธ ไฟล์ในเครื่องเท่านั้นเบราว์เซอร์คาดว่าจะเข้ารหัสและป้องกันอักขระทั้งหมดที่กำหนด (ในด้านบนคุณควรเว้นวรรคดังที่แสดงไว้เนื่องจาก %เป็นอักขระชื่อไฟล์ที่ถูกต้องและจะเข้ารหัส) เมื่อทำการแปลง ไปยัง URL ที่เหมาะสม (ดูจุดต่อไป)
  • หากคุณระบุ URL พร้อมกับfile://โปรโตคอลโดยพื้นฐานแล้วคุณจะระบุว่าคุณได้ใช้มาตรการป้องกันทั้งหมดและเข้ารหัสสิ่งที่ต้องการการเข้ารหัสส่วนที่เหลือควรถือเป็นอักขระพิเศษ file:///c:/my%20path/my%20file.htmlในตัวอย่างข้างต้นคุณจึงควรให้ นอกเหนือจากการแก้ไขเครื่องหมายทับแล้วไคลเอ็นต์ไม่ควรเข้ารหัสอักขระที่นี่

หมายเหตุ:

  • ทิศทางของสแลช - ใช้เครื่องหมายทับไปข้างหน้า/ใน URL, เครื่องหมายทับย้อนกลับ\ในเส้นทางของ Windows แต่ไคลเอนต์ส่วนใหญ่จะทำงานร่วมกับทั้งสองอย่างโดยการแปลงให้เป็นเครื่องหมายทับที่เหมาะสม
  • นอกจากนี้ยังมีเครื่องหมายทับ 3 ตัวหลังชื่อโปรโตคอลเนื่องจากคุณกำลังอ้างถึงเครื่องปัจจุบันอย่างเงียบ ๆ แทนที่จะเป็นโฮสต์ระยะไกล (พา ธ แบบไม่ย่อแบบเต็มจะเป็นfile://localhost/c:/my%20path/my%file.html) แต่อีกครั้งไคลเอนต์ส่วนใหญ่จะทำงานโดยไม่มีส่วนโฮสต์ (เช่นสองเครื่องหมายทับเท่านั้น ) โดยสมมติว่าคุณหมายถึงเครื่องท้องถิ่นและเพิ่มเครื่องหมายทับที่สาม

1
Hexblot ถูกต้องที่นี่ โดยปกติแล้วสิ่งนี้จะเกิดขึ้นเมื่อคุณเข้ารหัส URL ของคุณโดยการเขียนโปรแกรมและบอทจะเข้ามาและเข้ารหัสเป็นครั้งที่สอง บอทมีนิสัยไม่ดีในการทำเช่นนี้ มีสองวิธีที่คุณสามารถจัดการกับปัญหานี้ได้ 1) คุณสามารถ 404 หรือ 401 โดยใช้ข้อยกเว้น try catch หรือคุณสามารถเขียนฟังก์ชันเล็ก ๆ ที่จะถอดรหัสค่าที่ถอดรหัสสองครั้งก่อนที่คุณจะส่งต่อไปยังวิธีอื่นสำหรับตรรกะทางธุรกิจ
Ryan Watts

สิ่งนี้ช่วยให้ฉันทราบว่าเหตุใดฉันจึงได้รับเมื่อส่งคำขอ jQuery ajax ฉันกำลังตั้งค่าแอตทริบิวต์ข้อมูลในคำขอ ajax GET ด้วยฟังก์ชัน encodeURIComponent กับค่า แต่ jQuery ทำตามค่าเริ่มต้นแล้วดังนั้นทำไมฉันจึงได้รับ% 2520 ขอบคุณที่เป็นประโยชน์จริงๆ
Asher

ไม่มีอาร์กิวเมนต์บรรทัดคำสั่งสำหรับ chrome เพื่อบอกว่าตีความหรือไม่ตีความลิงก์หรือไม่?
AleX_

ฉันมีhttp://mysite/test & that... If I use UrlEncode` ซึ่งจะเปลี่ยนไปhttp://mysite/test%20&%20thatแต่ฉันก็ต้องการ&ให้เปลี่ยนเป็น% 26 เช่นกันดังนั้นไซต์ของฉัน/ ทดสอบ% 20% 26% 20นั่นคือฉันจะทำเช่นนั้นได้อย่างไร?
Si8

10

สำหรับบางคน - อาจถูกต้อง - เหตุผลที่ URL ถูกเข้ารหัสสองครั้ง %25คือ%เครื่องหมายurlencoded ดังนั้น URL เดิมจึงดูเหมือน:

http://server.com/my path/

จากนั้นได้รับ urlencoded หนึ่งครั้ง:

http://server.com/my%20path/

และสองครั้ง:

http://server.com/my%2520path/

ดังนั้นคุณไม่ควรทำ urlencoding - ในกรณีของคุณ - เนื่องจากส่วนประกอบอื่น ๆ ดูเหมือนจะเป็นเช่นนั้นสำหรับคุณแล้ว ใช้เพียงช่องว่าง


ฉันพบปัญหาเดียวกัน แต่ฉันไม่เข้าใจว่าเหตุใดการเข้ารหัส URL เริ่มต้นจึงถูกประมวลผลสองครั้งในครั้งแรก
jungwon jin

การเข้ารหัสสองครั้งอาจเป็นผลลัพธ์ที่ถูกต้องสมบูรณ์ของการใช้การเข้ารหัสอย่างถูกต้องทั้งนี้ขึ้นอยู่กับสถานการณ์ คำตอบนี้อาจสร้างความรู้สึกว่าการเข้ารหัสสองครั้งนั้นผิดอยู่เสมอและคุณสามารถแก้ไขปัญหาการเข้ารหัสได้โดยการเพิ่มการเข้ารหัส / ยกเลิกการเข้ารหัสให้มากที่สุดเท่าที่จำเป็นเพื่อ "ทำให้มันใช้งานได้" นี่เป็นสิ่งที่ผิดและนี่คือจุดบกพร่องในการเข้ารหัสตั้งแต่แรก -1
Florian Winter

@FlorianWinter ฉันไม่เห็นจริงๆว่าคุณอ่านข้อความนี้ระหว่างบรรทัดที่ไหน คุณช่วยฉันออกไปได้ไหม (โปรดอ่านคำถามและคำตอบของฉัน)
hek2mgl

7

เมื่อคุณพยายามเยี่ยมชมชื่อไฟล์ในเครื่องผ่านเบราว์เซอร์ Firefox คุณต้องบังคับใช้file:\\\โปรโตคอล ( http://en.wikipedia.org/wiki/File_URI_scheme ) มิฉะนั้น firefox จะเข้ารหัสพื้นที่ของคุณ TWICE เปลี่ยนข้อมูลโค้ด html จากสิ่งนี้:

<img src="C:\Documents and Settings\screenshots\Image01.png"/>

สำหรับสิ่งนี้:

<img src="file:\\\C:\Documents and Settings\screenshots\Image01.png"/>

หรือสิ่งนี้:

<img src="file://C:\Documents and Settings\screenshots\Image01.png"/>

จากนั้น firefox จะได้รับแจ้งว่านี่เป็นชื่อไฟล์ในเครื่องและแสดงภาพอย่างถูกต้องในเบราว์เซอร์โดยเข้ารหัสสตริงครั้งเดียวอย่างถูกต้อง

ลิงค์ที่เป็นประโยชน์: http://support.mozilla.org/en-US/questions/900466


0

ข้อมูลโค้ดต่อไปนี้ช่วยแก้ปัญหาของฉันได้ คิดว่าสิ่งนี้อาจเป็นประโยชน์กับคนอื่น ๆ

var strEnc = this.$.txtSearch.value.replace(/\s/g, "-");
strEnc = strEnc.replace(/-/g, " ");

แทนที่จะใช้ค่าเริ่มต้นencodeURIComponentบรรทัดแรกของฉันคือการแปลงรหัสทั้งหมดspacesเข้าhyphensใช้รูปแบบ regex /\s\gและบรรทัดต่อไปนี้ก็ไม่ย้อนกลับคือแปลงhyphensกลับไปใช้อีกspaces regex pattern /-/gที่นี่/gมีหน้าที่ในการfinding allจับคู่อักขระ

เมื่อฉันส่งค่านี้ไปยังการโทร Ajax ของฉันมันจะข้ามผ่านnormal spacesหรือง่าย ๆ%20และกำจัดdouble-encodingออกไป


1
ฉันคิดว่าเป็นเพราะคุณไม่ได้แก้ปัญหานี้เพียงแค่ปกปิด - ต้นตอของปัญหายังคงอยู่ที่นั่นและคุณกำลังทำงานสองครั้ง (บางแห่งคุณกำลังเข้ารหัสสองครั้งโดยไม่ได้ตั้งใจและที่อื่นคุณกำลังถอดรหัสด้วยตนเองเพื่อให้ครอบคลุม มันขึ้น). สมมติว่าคุณต้องการทำสิ่งต่างๆ "อย่างถูกต้อง" สิ่งที่ดีที่สุดคือการแก้ไขข้อบกพร่องและค้นหาผู้กระทำผิดที่แท้จริง
Nick Andriopoulos

จริงๆแล้ววิธีแก้ปัญหาใช้ได้ผลกับฉันทุกที่ที่ฉันพบปัญหา ก็เลยโพสต์.
Subrata Sarkar

2
@NiladriSarkar สิ่งที่ hexbolt พยายามจะบอกก็คือในขณะที่รหัสของคุณใช้งานได้มันไม่ใช่วิธีแก้ปัญหาที่ทำงานได้แทนที่จะเป็นการแก้ไขที่สกปรกและควรหลีกเลี่ยง ...
2Dee

-1

ลองดูไหม

encodeURIComponent('space word').replace(/%20/g,'+')


1
ยินดีต้อนรับสู่ StackOverflow! คำตอบโดยทั่วไปจะมีประโยชน์มากกว่าหากมีคำอธิบายเกี่ยวกับสาเหตุที่คำแนะนำของคุณจะช่วยแก้ปัญหาของ OP ได้แทนที่จะเป็นเพียงแค่ข้อมูลโค้ด นอกจากนี้เนื่องจากคำถามนี้มีคำตอบที่เป็นที่ยอมรับแล้วจึงควรเพิ่มคำอธิบายว่าทำไมคำตอบของคุณจึงถูกต้องมากกว่าคำถามนั้น
DaveyDaveDave
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.