Không gian html đang hiển thị dưới dạng% 2520 thay vì% 20


109

Chuyển tên tệp vào trình duyệt firefox sẽ khiến nó thay thế khoảng trắng bằng %2520 thay vì %20.

Tôi có HTML sau trong một tệp có tên myhtml.html:

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

Khi tôi tải myhtml.htmlvào firefox, hình ảnh hiển thị dưới dạng hình ảnh bị hỏng. Vì vậy, tôi nhấp chuột phải vào liên kết để xem hình ảnh và nó hiển thị URL đã sửa đổi này:

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

Cái quái gì vậy? Nó đã chuyển đổi không gian của tôi thành một %2520. Không nên chuyển đổi nó thành a %20?

Làm cách nào để thay đổi tệp HTML này để trình duyệt có thể tìm thấy hình ảnh của tôi? Những gì đang xảy ra ở đây?

Câu trả lời:


219

Giải thích một chút về điều đó %2520là:

Ký tự khoảng trắng chung được mã hóa %20như bạn đã tự lưu ý. Ký %tự được mã hóa dưới dạng %25.

Cách bạn nhận được %2520là khi url của bạn đã có %20trong đó và được urlenccode một lần nữa, điều này sẽ chuyển %20thành %2520.

Bạn có (hoặc bất kỳ khuôn khổ nào bạn có thể đang sử dụng) các ký tự mã hóa kép không?

Chỉnh sửa: Mở rộng một chút về điều này, đặc biệt là đối với các liên kết ĐỊA PHƯƠNG . Giả sử bạn muốn liên kết đến tài nguyên C:\my path\my file.html:

  • nếu bạn chỉ cung cấp đường dẫn tệp cục bộ, trình duyệt dự kiến ​​sẽ mã hóa và bảo vệ tất cả các ký tự đã cho (ở phần trên, bạn nên cung cấp cho nó khoảng trống như được hiển thị, vì %là ký tự tên tệp hợp lệ và như vậy nó sẽ được mã hóa) khi chuyển đổi đến một URL thích hợp (xem điểm tiếp theo).
  • nếu bạn cung cấp một URL với file://giao thức, về cơ bản bạn đang nói rằng bạn đã thực hiện tất cả các biện pháp phòng ngừa và mã hóa những gì cần mã hóa, phần còn lại nên được coi là các ký tự đặc biệt. Trong ví dụ trên, bạn nên cung cấp file:///c:/my%20path/my%20file.html. Ngoài việc sửa các dấu gạch chéo, máy khách không nên mã hóa các ký tự ở đây.

LƯU Ý:

  • Hướng gạch chéo - dấu gạch chéo về phía trước /được sử dụng trong URL, dấu gạch chéo ngược \trong đường dẫn Windows, nhưng hầu hết các ứng dụng khách sẽ làm việc với cả hai bằng cách chuyển đổi chúng thành dấu gạch chéo về phía trước thích hợp.
  • Ngoài ra, có 3 dấu gạch chéo sau tên giao thức, vì bạn đang âm thầm đề cập đến máy hiện tại thay vì máy chủ từ xa (đường dẫn không viết tắt đầy đủ sẽ là file://localhost/c:/my%20path/my%file.html), nhưng một lần nữa hầu hết các máy khách sẽ hoạt động mà không có phần máy chủ (tức là chỉ có hai dấu gạch chéo ) bằng cách giả sử ý bạn là máy cục bộ và thêm dấu gạch chéo thứ ba.

1
Hexblot thực sự đúng ở đây. Thông thường, điều này xảy ra khi bạn mã hóa url của mình bằng cách lập trình và một bot đến và mã hóa nó lần thứ hai. Bots có một thói quen xấu khi làm điều này. Có hai là bạn có thể xử lý vấn đề này. 1) Bạn có thể 404 hoặc 401 với một ngoại lệ try catch hoặc bạn có thể viết một hàm nhỏ sẽ giải mã các giá trị được giải mã kép trước khi bạn chuyển nó cho một phương pháp khác cho logic nghiệp vụ.
Ryan Watts

Điều này đã giúp tôi tìm ra lý do tại sao tôi nhận được nó khi gửi một yêu cầu ajax jQuery. Tôi đang đặt thuộc tính dữ liệu trong một yêu cầu ajax GET với hàm encodeURIComponent trên giá trị, nhưng jQuery đã thực hiện điều đó theo mặc định, do đó tại sao tôi nhận được% 2520. Thực sự hữu ích cảm ơn.
Asher

Không có đối số dòng lệnh nào để chrome cho biết nó diễn giải hoặc không diễn giải liên kết?
AleX_

Tôi có http://mysite/test & that... If I use UrlEncode` nó thay đổi thành http://mysite/test%20&%20thatnhưng tôi cũng muốn &thay đổi thành% 26 vì vậy nó là mysite / test% 20% 26% 20that `Làm cách nào để làm điều đó?
Si8

10

Đối với một số - có thể hợp lệ - lý do url được mã hóa hai lần. %25%dấu hiệu urlencoded . Vì vậy, url ban đầu trông giống như:

http://server.com/my path/

Sau đó, nó đã được urlencodes một lần:

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

và hai lần:

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

Vì vậy, bạn không nên mã hóa urlencoding - trong trường hợp của bạn - vì các thành phần khác dường như đã có sẵn cho bạn. Chỉ sử dụng một không gian


Tôi gặp sự cố tương tự nhưng tôi không hiểu tại sao mã urlencoding mặc định lại được xử lý hai lần vào lần đầu tiên.
jungwon jin

Tùy thuộc vào tình huống, mã hóa kép có thể là kết quả hoàn toàn hợp lệ của việc sử dụng mã hóa đúng cách. Câu trả lời này có thể tạo ấn tượng rằng mã hóa kép luôn sai và bạn có thể chỉ cần khắc phục sự cố mã hóa bằng cách thêm nhiều lệnh gọi mã hóa / không mã hóa nếu cần để "làm cho nó hoạt động". Điều này là sai và đây là cách lỗi mã hóa xuất hiện ngay từ đầu. -1
Florian Winter

@FlorianWinter Tôi thực sự không hiểu bạn đọc cái này ở đâu giữa các dòng. Bạn có thể giúp tôi không? (Vui lòng đọc câu hỏi và câu trả lời của tôi)
hek2mgl

7

Khi bạn đang cố gắng truy cập tên tệp cục bộ thông qua trình duyệt firefox, bạn phải buộc file:\\\giao thức ( http://en.wikipedia.org/wiki/File_URI_scheme ), nếu không firefox sẽ mã hóa không gian của bạn hai lần. Thay đổi đoạn mã html từ đoạn mã này:

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

đến điều này:

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

hoặc cái này:

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

Sau đó, firefox được thông báo rằng đây là tên tệp cục bộ và nó hiển thị hình ảnh chính xác trong trình duyệt, mã hóa chính xác chuỗi một lần.

Liên kết hữu ích: http://support.mozilla.org/en-US/questions/900466


0

Đoạn mã sau đã giải quyết vấn đề của tôi. Nghĩ rằng điều này có thể hữu ích cho những người khác.

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

Thay vì sử dụng mặc định, encodeURIComponentdòng mã đầu tiên của tôi đang chuyển đổi tất cả spacesthành hyphenssử dụng mẫu regex /\s\gvà dòng sau chỉ làm ngược lại, tức là chuyển đổi tất cả hyphenstrở lại spacessử dụng mẫu khác regex pattern /-/g. Ở đây /gthực sự chịu trách nhiệm về việc finding allkhớp các ký tự.

Khi tôi gửi giá trị này đến lệnh gọi Ajax của mình, nó sẽ truyền đi ngang normal spaceshoặc đơn giản %20và do đó bị loại bỏ double-encoding.


1
Tôi cho rằng bởi vì bạn không giải quyết vấn đề, chỉ che đậy nó - nguyên nhân gốc rễ là nó vẫn ở đâu đó và bạn đang thực hiện công việc kép (ở nơi nào đó bạn vô tình mã hóa hai lần và ở nơi khác bạn đang giải mã thủ công để che nó lên). Giả sử bạn muốn làm mọi thứ "đúng cách", điều tốt nhất là gỡ lỗi và tìm ra thủ phạm thực sự.
Nick Andriopoulos

Trên thực tế, giải pháp đã làm việc cho tôi bất cứ nơi nào tôi gặp vấn đề này. Vì vậy, tôi đã đăng.
Subrata Sarkar

2
@NiladriSarkar những gì hexbolt đang cố gắng nói là mặc dù mã của bạn hoạt động, nó không phải là một giải pháp khả thi, đúng hơn là một bản sửa lỗi bẩn và nên tránh ...
2Dee 10/12/16

-1

Thử cái này?

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


1
Chào mừng bạn đến với StackOverflow! Nói chung, các câu trả lời sẽ hữu ích hơn nếu chúng bao gồm một số giải thích về lý do tại sao đề xuất của bạn sẽ giải quyết được vấn đề của OP, thay vì chỉ là một đoạn mã. Ngoài ra, vì câu hỏi này đã có một câu trả lời được chấp nhận, nên bạn nên thêm một số lời giải thích tại sao câu trả lời của bạn đúng hơn câu trả lời đó.
DaveyDaveDave
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.