Saya menulis kode yang secara otomatis menghasilkan HTML, dan saya ingin menyandikannya dengan benar.
Katakanlah saya sedang membuat tautan ke URL berikut:
http://www.google.com/search?rls=en&q=stack+overflow
Saya berasumsi bahwa semua nilai atribut harus dikodekan-HTML. (Tolong koreksi saya jika saya salah.) Jadi itu berarti jika saya meletakkan URL di atas ke dalam jangkar tag, saya harus menyandikan ampersand sebagai &
, seperti ini:
<a href="http://www.google.com/search?rls=en&q=stack+overflow">
Apakah itu benar?
Jawaban:
Ya itu. Entitas HTML diuraikan di dalam atribut HTML, dan nyasar
&
akan menciptakan ambiguitas. Itu sebabnya Anda harus selalu menulis,&
bukan hanya&
di dalam semua atribut HTML.Yang mengatakan, hanya
&
dan kutipan perlu dikodekan. Jika Anda memiliki karakter khusus sepertié
pada atribut Anda, Anda tidak perlu menyandikannya untuk memenuhi parser HTML.Dulu, URL membutuhkan perlakuan khusus dengan karakter non-ASCII
é
. Anda harus menyandikan mereka yang menggunakan persen-lolos, dan dalam hal ini akan memberikan%C3%A9
, karena mereka ditentukan oleh RFC 1738 . Namun, RFC 1738 telah digantikan oleh RFC 3986 (URI, Uniform Resource Identifiers) dan RFC 3987 (IRI, Pengidentifikasi Sumberdaya Internasional), di mana WhatWG mendasarkan pekerjaannya untuk menentukan bagaimana peramban harus berperilaku ketika mereka melihat URL dengan non-ASCII karakter di dalamnya sejak HTML5 . Karenanya sekarang aman untuk memasukkan karakter non-ASCII dalam URL, yang disandikan atau tidak.sumber
é
masih membutuhkan pengodean: stackoverflow.com/questions/2742852/unicode-characters-in-urls&
ke atribut tag daripada menggunakan secara langsung&
.Dengan rekomendasi HTML resmi saat ini, ampersand harus diloloskan misalnya seperti
&
dalam konteks seperti ini. Namun, browser tidak memerlukannya, dan HTML5 CR mengusulkan untuk membuat aturan ini , sehingga aturan khusus berlaku dalam nilai atribut. Validator HTML5 saat ini sudah ketinggalan zaman dalam hal ini (lihat laporan bug dengan komentar).Akan tetap memungkinkan untuk keluar dari ampersand dalam nilai atribut, tetapi selain validasi dengan alat saat ini, tidak ada kebutuhan praktis untuk menghindarinya dalam
href
nilai (dan ada risiko kecil membuat kesalahan jika Anda mulai melarikan diri dari mereka).sumber
application/xhtml+xml
) kemungkinan besar akan selalu membutuhkan itu, meskipun.&
itu seharusnya baik-baik saja sekarang, selama itu " tidak ambigu". Salah satu cara yang jelas untuk membuat ampers dan ambigu adalah mengikutinya terlebih dahulu dengan karakter non-spasi dan kemudian titik koma. Ampersand itu sekarang ambigu, dan akan menyebabkan kesalahan parse.&
akan ambigu. Oleh karena itu, kami terus menggunakannya tanpa atribut dalam atribut href.Saya memposting jawaban baru karena saya menemukan jawaban zneak tidak memiliki cukup contoh, tidak menunjukkan penanganan HTML dan URI sebagai aspek dan standar yang berbeda dan ada beberapa hal kecil yang hilang.
Anda memiliki dua standar tentang URL di tautan (
<a href
).Standar pertama adalah RFC 1866 (HTML 2.0) di mana dalam "3.2.1. Data Characters" Anda dapat membaca karakter yang harus diloloskan ketika digunakan sebagai nilai untuk atribut HTML. (Atribut sendiri tidak memungkinkan karakter khusus sama sekali, misalnya
<a hr&ef="http://...
tidak diizinkan, juga tidak<a hr&ef="http://...
.)Kemudian ini telah masuk ke standar HTML 4 , karakter yang Anda butuhkan untuk melarikan diri adalah:
Standar lainnya adalah RFC 3986 "Standar URI generik", di mana URL ditangani (ini terjadi ketika browser akan mengikuti tautan karena pengguna mengklik elemen HTML).
Penting untuk melarikan diri dari karakter tersebut sehingga klien tahu apakah mereka mewakili data atau pembatas.
Contoh tidak terhapus:
Contoh, URL yang sepenuhnya sah
Contoh URL sepenuhnya sah dalam nilai atribut HTML:
Skenario juga penting:
Javascript sebagai nilai:
<img src="..." onclick="window.location.href = "https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com";">...</a>
(Ya,;;
benar.)JSON sebagai nilai:
<a href="..." data-analytics="{"event": "click"}">...</a>
Hal-hal yang lolos di dalam hal-hal yang lolos, pengkodean ganda, URL di dalam URL di dalam parameter dll, ...
http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&password=""123
sumber
Ya, Anda harus mengonversi
&
ke&
.Alat validator html oleh W3C ini membantu untuk pertanyaan seperti ini. Ini akan memberi tahu Anda kesalahan dan peringatan untuk halaman tertentu.
sumber
&
dalam href) sebagai kesalahan.