Dlaczego HTML uważa "chucknorris" za kolor?
Jak to możliwe, że niektóre losowe ciągi znaków tworzą Kolory, gdy są wprowadzane jako kolory tła w HTML? Na przykład:
<body bgcolor="chucknorris"> test </body>
...tworzy dokument z czerwonym tłem we wszystkich przeglądarkach i platformach.
Co ciekawe, podczas gdy chucknorri
tworzy również czerwone tło, chucknorr
tworzy żółte tło.
8 answers
To jest holdover z dni Netscape:
Brakujące cyfry są traktowane jako 0 [...]. Niepoprawna cyfra jest po prostu interpretowana jako 0. Na przykład wartości #f0f0f0, F0F0F0, f0f0f, #fxfxfx i fxfxfx są takie same.
Pochodzi z postu na blogumała rant na temat parsowania kolorów Microsoft Internet Explorer który obejmuje go bardzo szczegółowo, w tym różne długości wartości kolorów, itp.
Jeśli zastosujemy Zasady kolejno od po wpisie na blogu otrzymujemy:
-
Zastąp wszystkie nieprzewidziane znaki szesnastkowe przez 0
chucknorris becomes c00c0000000
-
Przesuń do następnej całkowitej liczby znaków podzielnych przez 3 (11 -> 12)
c00c 0000 0000
-
Podzielone na trzy równe grupy, przy czym każdy składnik reprezentuje odpowiadający mu Składnik koloru RGB:
RGB (c00c, 0000, 0000)
-
Obcinaj każdy z argumentów od prawej do dwóch znaki
Co daje następujący wynik:
RGB (c0, 00, 00) = #C00000 or RGB(192, 0, 0)
Oto przykład pokazujący atrybut bgcolor
w działaniu, aby uzyskać tę "niesamowitą" próbkę koloru:
<table>
<tr>
<td bgcolor="chucknorris" cellpadding="8" width="100" align="center">chuck norris</td>
<td bgcolor="mrt" cellpadding="8" width="100" align="center" style="color:#ffffff">Mr T</td>
<td bgcolor="ninjaturtle" cellpadding="8" width="100" align="center" style="color:#ffffff">ninjaturtle</td>
</tr>
<tr>
<td bgcolor="sick" cellpadding="8" width="100" align="center">sick</td>
<td bgcolor="crap" cellpadding="8" width="100" align="center">crap</td>
<td bgcolor="grass" cellpadding="8" width="100" align="center">grass</td>
</tr>
</table>
To również odpowiada na drugą część pytania; dlaczego bgcolor="chucknorr"
produkuje żółty kolor? Cóż, jeśli zastosujemy reguły, ciąg znaków to:
c00c00000 => c00 c00 000 => c0 c0 00 [RGB(192, 192, 0)]
, co daje jasnożółtą barwę złota. Ponieważ ciąg zaczyna się od 9 znaków, tym razem zachowujemy drugie C wokół stąd kończy się w ostatecznej wartości koloru.
Natknąłem się na to, kiedy ktoś wskazał, że możesz to zrobić color="crap"
i, cóż, wychodzi to na brąz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-31 12:08:56
Przykro mi, że się nie Zgadzam, ale zgodnie z zasadami parsowania wartości kolorów napisanych przez @ Yuhong Bao, chucknorris
nie oznacza #CC0000
, ale raczej #C00000
, bardzo podobnego, ale nieco innego odcienia czerwieni. Aby to sprawdzić, użyłem dodatku Firefox ColorZilla add-on .
Regulamin stanowi:
- Utwórz ciąg o długości, która jest wielokrotnością 3, dodając 0s:
chucknorris0
- rozdziel łańcuch na 3 ciągi o równej długości:
chuc knor ris0
- obcinaj każdy łańcuch do 2 znaków:
ch kn ri
- zachowaj wartości szesnastkowe i dodaj 0 w razie potrzeby:
C0 00 00
Udało mi się użyć tych reguł, aby poprawnie zinterpretować następujące ciągi znaków:
LuckyCharms
Luck
LuckBeALady
LuckBeALadyTonight
-
GangnamStyle
UPDATE: oryginalni odpowiedzi, którzy powiedzieli, że kolor był #CC0000
, od tego czasu edytowali swoje odpowiedzi, aby uwzględnić korektę.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-05 17:10:38
Większość przeglądarek po prostu zignoruje wszelkie wartości nie szesnastkowe w ciągu kolorów, zastępując cyfry nie szesnastkowe zerami.
ChuCknorris
tłumaczy się na c00c0000000
. W tym momencie przeglądarka podzieli ciąg znaków na trzy równe sekcje, wskazując Czerwony , zielony i niebieski wartości: c00c 0000 0000
. Dodatkowe bity w każdej sekcji zostaną zignorowane, co sprawi, że końcowy wynik #c00000
będzie czerwonawy.
Uwaga, Nie dotyczy to parsowania kolorów CSS, które postępuj zgodnie ze standardem CSS.
<p><font color='chucknorris'>Redish</font></p>
<p><font color='#c00000'>Same as above</font></p>
<p><span style="color: chucknorris">Black</span></p>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-17 16:09:13
Przeglądarka próbuje przekonwertować chucknorris
Na kod koloru szesnastkowego, ponieważ nie jest to prawidłowa wartość.
- W
chucknorris
, wszystko opróczc
nie jest prawidłową wartością szesnastkową. - więc zostaje przekształcony na
c00c00000000
. - który staje się#c00000 , odcieniem czerwieni.
P. S. The liczby w nawiasach to wersje przeglądarek, na których testowałem.
.
Na zapalniczce
Chuck Norris nie spełnia standardów internetowych. Standardy sieciowe są zgodne za niego. ~ BADA55
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-11 06:08:02
Specyfikacja HTML WHATWG ma dokładny algorytm parsowania starszej wartości koloru: https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-legacy-colour-value
Kod Netscape Classic używany do parsowania ciągów kolorów jest open source: https://dxr.mozilla.org/classic/source/lib/layout/layimage.c#155
Na przykład, zauważ, że każdy znak jest przetwarzany jako cyfra szesnastkowa, a następnie jest przesuwany do 32-bitowej liczby całkowitej bez sprawdzania overflow . Tylko osiem cyfr hex pasuje do 32-bitowej liczby całkowitej, dlatego tylko ostatnie 8 znaków są brane pod uwagę. Po przetworzeniu cyfr szesnastkowych na 32-bitowe liczby całkowite, są one następnie obcięte na 8-bitowe liczby całkowite, dzieląc je przez 16, dopóki nie zmieszczą się w 8-bitowe, dlatego początkowe zera są ignorowane.
Update: ten kod nie pasuje do tego, co jest zdefiniowane w specyfikacji, ale jedyną różnicą jest kilka linijek kodu. Myślę, że to właśnie te linie zostały dodane (w Netscape 4):
if (bytes_per_val > 4)
{
bytes_per_val = 4;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-26 18:45:01
Odpowiedź:
- przeglądarka spróbuje przekonwertować chucknorris na wartość szesnastkową.
- ponieważ
c
jest jedynym prawidłowym znakiem szesnastkowym w chucknorris , wartość zmienia się w:c00c00000000
(0 dla wszystkich wartości, które były nieprawidłowe ). - przeglądarka dzieli wynik na 3 grupy:
Red = c00c
,Green = 0000
,Blue = 0000
. - ponieważ ważne wartości szesnastkowe dla tła html zawierają tylko 2 cyfry dla każdego typu kolorów (r, g , b ), ostatnie 2 cyfry są obcięte z każdej grupy, pozostawiając wartość RGB
c00000
, która jest ceglasto-czerwonawym kolorem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-08 06:20:05
Powodem jest to, że przeglądarka może nie zrozumieć to i spróbuj jakoś przetłumaczyć go na to, co może zrozumieć, a w tym przypadku do wartości szesnastkowej!
chucknorris
zaczyna się od c
, która jest rozpoznawanym znakiem w systemie szesnastkowym, a także konwertuje wszystkie nierozpoznane znaki na 0
!
Więc chucknorris
w formacie szesnastkowym staje się: c00c00000000
, Wszystkie pozostałe znaki stają się 0
i c
pozostają tam, gdzie są...
Teraz dzielą się przez 3 dla RGB
(czerwony, zielony, niebieski)... R: c00c, G: 0000, B:0000
...
Ale wiemy, że poprawny szesnastkowy dla RGB to tylko 2 znaki, czyli R: c0, G: 00, B:00
Więc prawdziwy wynik jest:
bgcolor="#c00000";
Dodałem również kroki na obrazku jako szybkie odniesienie:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-12 13:09:29
Chucknorris jest statystyką z c przeglądarka wczytana do wartości szesnastkowej.
Ponieważ a, b, c,d,e, f są znakami szesnastkowymi
Przeglądarka chucknorris
konwertuje na c00c00000000
wartość szesnastkową.
Następnie c00c00000000
Przelicz wartość szesnastkową na RGB format (podzielony przez 3)
c00c00000000
=>R:c00c,G:0000,B:0000
Przeglądarka potrzebuje tylko 2 cyfry, aby wskazać kolor.
R:c00c,G:0000,B:0000
=>R:c0,G:00,B:00
=>c00000
Na koniec Pokaż bgcolor = c00000
w przeglądarce internetowej.
Oto przykład demonstrujący
<table>
<tr>
<td bgcolor="chucknorris" cellpadding="10" width="150" align="center">chucknorris</td>
<td bgcolor="c00c00000000" cellpadding="10" width="150" align="center">c00c00000000</td>
<td bgcolor="c00000" cellpadding="10" width="150" align="center">c00000</td>
</tr>
</table>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-17 19:16:30