Piszę kod, który automatycznie generuje HTML i chcę, aby kodował poprawnie.
Powiedzmy, że generuję łącze do następującego adresu URL:
http://www.google.com/search?rls=en&q=stack+overflow
Zakładam, że wszystkie wartości atrybutów powinny być zakodowane w formacie HTML. (Proszę poprawić mnie, jeśli się mylę.) Oznacza to, że jeśli umieszczam powyższy adres URL w tagu kotwicy, powinienem zakodować ampersand as &
, na przykład:
<a href="http://www.google.com/search?rls=en&q=stack+overflow">
Czy to jest poprawne?
Odpowiedzi:
Tak to jest. Jednostki HTML są analizowane wewnątrz atrybutów HTML, a zbłąkane elementy
&
spowodowałyby niejednoznaczność. Dlatego zawsze powinieneś pisać,&
a nie tylko&
wewnątrz wszystkich atrybutów HTML.To powiedziawszy, tylko
&
i cytaty muszą być zakodowane. Jeśli masz znaki specjalne, takie jaké
w swoim atrybucie, nie musisz ich kodować, aby spełnić wymagania parsera HTML.Kiedyś adresy URL wymagały specjalnego traktowania ze znakami spoza zestawu ASCII, na przykład
é
. Trzeba było zakodować te za pomocą znaków procentowych, aw tym przypadku dałoby to%C3%A9
, ponieważ zostały zdefiniowane w RFC 1738 . Jednak RFC 1738 został zastąpiony przez RFC 3986 (URI, Uniform Resource Identifiers) i RFC 3987 (IRI, Internationalized Resource Identifiers), na których opiera swoją pracę WhatWG, aby zdefiniować, jak powinny zachowywać się przeglądarki, gdy widzą adres URL bez ASCII znaków w nim od HTML5 . Dlatego teraz można bezpiecznie umieszczać w adresach URL znaki spoza zestawu ASCII, zakodowane procentowo lub nie.źródło
é
nadal wymaga kodowania: stackoverflow.com/questions/2742852/unicode-characters-in-urls&
do atrybutu tagu, zamiast używać go bezpośrednio&
.Zgodnie z aktualnymi oficjalnymi zaleceniami HTML, znak ampersand musi zostać zmieniony, np. Jak
&
w takich kontekstach. Jednak przeglądarki tego nie wymagają, a HTML5 CR proponuje uczynić z tego regułę , więc specjalne reguły mają zastosowanie do wartości atrybutów. Obecne walidatory HTML5 są pod tym względem przestarzałe (zobacz raport o błędzie z komentarzami).Nadal możliwe będzie uniknięcie znaku ampersand w wartościach atrybutów, ale poza sprawdzaniem poprawności za pomocą aktualnych narzędzi nie ma praktycznej potrzeby ucieczki przed nimi w
href
wartościach (i istnieje niewielkie ryzyko popełnienia błędów, jeśli zaczniesz od nich uciekać).źródło
application/xhtml+xml
) najprawdopodobniej zawsze będzie tego wymagał.&
ma być ok teraz, tak długo, jak to jest „ un niejednoznaczne”. Jednym z oczywistych sposobów uczynienia znaku ampersand niejednoznacznym jest umieszczenie po nim znaków innych niż spacja, a następnie średnika. Że ampersand jest niejednoznaczny i będzie powodować Błąd analizy.&
będzie niejednoznaczne. Dlatego nadal używamy go niezakodowanego w atrybutach href.Publikuję nową odpowiedź, ponieważ uważam, że odpowiedź zneak nie zawiera wystarczającej liczby przykładów, nie pokazuje obsługi HTML i URI jako różnych aspektów i standardów oraz brakuje w niej kilku drobnych rzeczy.
Masz dwa standardy dotyczące adresów URL w linkach (
<a href
).Pierwszym standardem jest RFC 1866 (HTML 2.0), gdzie w „3.2.1. Znaki danych” można odczytać znaki, które muszą zostać zmienione, gdy są używane jako wartość atrybutu HTML. (Same atrybuty w ogóle nie zezwalają na znaki specjalne, np.
<a hr&ef="http://...
Nie są dozwolone ani nie są<a hr&ef="http://...
).Później przeszło to do standardu HTML 4 , znaki, których potrzebujesz, to:
Drugim standardem jest RFC 3986 „Generic URI standard”, w którym obsługiwane są adresy URL (dzieje się tak, gdy przeglądarka ma zamiar przejść do odsyłacza, ponieważ użytkownik kliknął element HTML).
Ważne jest, aby uniknąć tych znaków, aby klient wiedział, czy reprezentują dane, czy separator.
Przykład bez zmiany znaczenia:
Przykład, w pełni legalny adres URL
Przykład w pełni poprawnego adresu URL w wartości atrybutu HTML:
Również ważne scenariusze:
Javascript jako wartość:
<img src="..." onclick="window.location.href = "https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com";">...</a>
(Tak,;;
ma rację).JSON jako wartość:
<a href="..." data-analytics="{"event": "click"}">...</a>
Elementy uciekające w elementach ze znakami ucieczki, podwójne kodowanie, adres URL wewnątrz adresu URL w parametrze itp., ...
http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&password=""123
źródło
Tak, powinieneś przekonwertować
&
na&
.Ten walidator HTML firmy W3C jest pomocny w przypadku takich pytań. Poinformuje Cię o błędach i ostrzeżeniach dla określonej strony.
źródło
&
w href) jako błąd.