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.

Co tu się dzieje?
Author: Gibin Ealias, 2011-11-30

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:

  1. Zastąp wszystkie nieprzewidziane znaki szesnastkowe przez 0

    chucknorris becomes c00c0000000
    
  2. Przesuń do następnej całkowitej liczby znaków podzielnych przez 3 (11 -> 12)

    c00c 0000 0000
    
  3. Podzielone na trzy równe grupy, przy czym każdy składnik reprezentuje odpowiadający mu Składnik koloru RGB:

    RGB (c00c, 0000, 0000)
    
  4. 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.

 6143
Author: dash,
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ę.

 846
Author: Jeremy Goodell,
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>
 343
Author: Mike Christensen,
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ść.

  1. W chucknorris, wszystko oprócz c nie jest prawidłową wartością szesnastkową.
  2. więc zostaje przekształcony na c00c00000000.
  3. który staje się#c00000 , odcieniem czerwieni.
Jest to problem głównie z Internet Explorerem i Operą (12), ponieważ zarówno Chrome (31), jak i Firefox (26) po prostu to ignorują.

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
 231
Author: aWebDeveloper,
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;
}
 192
Author: Yuhong Bao,
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.
 173
Author: Webeng,
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:

Dlaczego HTML uważa "chucknorris" za kolor?

 148
Author: Alireza,
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>
 7
Author: sameera lakshitha,
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