Dlaczego HTML uważa, że ​​„chucknorris” jest kolorem?


7485

W jaki sposób niektóre losowe ciągi tworzą kolory po wprowadzeniu 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, choć chucknorritworzy również czerwone tło, chucknorrwytwarza żółte tło.

Co tu się dzieje?


154
Na marginesie: nie używaj bgcolor. Użyj CSS background.
John Dvorak

47
Dlaczego kiedykolwiek chcesz dodać kolor tła o nazwie chucknorris? Jaki był oczekiwany kolor?
masterFly,

106
@masterFly: Nie wiem, dlaczego mój komentarz pod zaakceptowaną odpowiedzią został usunięty, ponieważ „nie jest konstruktywny”, ponieważ dość dobrze odpowiada na twoje pytanie: ludzie cały czas eksperymentują z tymi rzeczami. Miałem zaledwie 10 lat, kiedy to odkryłem, i wszystko, co wtedy robiłem, to grzebanie wokoło i zobaczenie, co się stało. Nie zawsze musisz mieć praktyczny powód, aby coś zrobić, zwłaszcza coś tak niepoważnego jak to.
BoltClock

49
a <body bgcolor="stevensegal">test </body> jest zielony
Chris

4
@BenDaggers Przeczytaj historię zmian przed dokonaniem kolejnej edycji. Css znacznik jest nieistotna i została już usunięta dwukrotnie.
Wyścigi lekkości na orbicie

Odpowiedzi:


6876

Jest to pozostałość po czasach Netscape:

Brakujące cyfry są traktowane jako 0 [...]. Niepoprawna cyfra jest po prostu interpretowana jako 0. Na przykład wszystkie wartości # F0F0F0, F0F0F0, F0F0F, #FxFxFx i FxFxFx są takie same.

Pochodzi z postu na blogu . Trochę o parsowaniu kolorów w programie 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 reguły kolejno od postu na blogu, otrzymamy:

  1. Zamień wszystkie niepoprawne znaki szesnastkowe na 0

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

    c00c 0000 0000
  3. Podziel się na trzy równe grupy, przy czym każdy komponent reprezentuje odpowiadającą składową koloru koloru RGB:

    RGB (c00c, 0000, 0000)
  4. Obetnij każdy argument od prawej do dwóch znaków

Co daje następujący wynik:

RGB (c0, 00, 00) = #C00000 or RGB(192, 0, 0)

Oto przykład pokazujący bgcoloratrybut w akcji, aby stworzyć 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 także odpowiada na drugą część pytania; dlaczego bgcolor="chucknorr"wytwarza żółty kolor? Cóż, jeśli zastosujemy reguły, ciąg będzie:

c00c00000 => c00 c00 000 => c0 c0 00 [RGB(192, 192, 0)]

Co daje kolor jasnożółtego złota. Ponieważ ciąg zaczyna się od 9 znaków, tym razem utrzymujemy drugie C, więc kończy się na końcowej wartości koloru.

Po raz pierwszy zetknąłem się z tym, gdy ktoś wskazał, że możesz to zrobić, color="crap"i cóż, okazuje się, że jest brązowy.


174
Należy zauważyć, że wbrew temu, co twierdzi, że na blogu, kiedy dojdziesz do obsługi ciągów 3-char, ty duplikat każdy znak, zamiast poprzedzenie 0. czyli 0F6staje #00FF66, nie #000F06.
Aaron Dufour,

634
@usr: HTML opiera się na celowym ignorowaniu nieprawidłowo wprowadzonych danych;)
Lily Ballard,

59
Możesz także użyć mojego losowego łańcucha do konwertera kolorów css, aby uzyskać kolor dla określonego łańcucha. Jest oparty na 5 krokach do obliczenia koloru sznurka według Jeremy'ego Goodella .
TimPietrusky 11.03.13

15
Ukryta szansa na semantykę? Możesz zrobić kilka stron błędów w ten sposób: <body bgcolor=error><h1 style=text-align:center>Error: Not Found<h1></span>Możesz dodać div z innym tłem lub coś takiego, więc nie jest to tak szokujące z estetycznego punktu widzenia.
Theraot

32
@Theraot też bgcolor="success"jest fajny zielony. Co ciekawe, można zastąpić te kolory za pomocą selektorów atrybutów / wartości CSS (np td[bgcolor="chucknorris"] {...}.).
daiscog

970

Przepraszam, że się nie zgadzam, ale zgodnie z zasadami analizy starszej wartości koloru opublikowanej przez @Yuhong Bao , chucknorrisNIE ZNACZY#CC0000 , ale raczej #C00000bardzo podobny, ale nieco inny odcień czerwieni. Użyłem Firefox ColorZilla dodatek do sprawdzenia tego.

Reguły stanowią:

  • ustaw ciąg o wielokrotności 3, dodając 0: chucknorris0
  • rozdziel ciąg na 3 ciągi o równej długości: chuc knor ris0
  • skróć każdy ciąg do 2 znaków: ch kn ri
  • zachowaj wartości szesnastkowe i w razie potrzeby dodaj 0: C0 00 00

Mogłem użyć tych reguł, aby poprawnie zinterpretować następujące ciągi:

  • LuckyCharms
  • Luck
  • LuckBeALady
  • LuckBeALadyTonight
  • GangnamStyle

AKTUALIZACJA: Oryginalni autorzy odpowiedzi, którzy twierdzili, że kolor był #CC0000od tego czasu, edytowali swoje odpowiedzi, aby uwzględnić poprawkę.


86
Zrozumiałem, błędnie zinterpretowałem niektóre instrukcje parsowania: „adamlevine” = „ada00e000e” = „ada00e000e00” = „ada0 0e00 0e00” = „ad 0e 0e” - Idealne !!
Jeremy Goodell,

17
Jeśli jesteś zainteresowany, opublikowałem 5-stopniowy algorytm jako AKTUALIZACJĘ na podobne pytanie, które zadałem dzisiaj: stackoverflow.com/questions/12939234/...
Jeremy Goodell,

18
@TimPietrusky stworzył to cholernie niesamowite narzędzie demonstracyjne do losowych nazw kolorów. Po prostu przejdź tutaj: randomstringtocsscolor.com i kliknij pole i wpisz „chucknorris”.
Jeremy Goodell,

4
adamlevinedziała jak na jsfiddle.net/LdyZ8/2959, ale litery są blokowane, w ada00e000ektórych są wstawiane, ale ada00e000e00następnie zmniejszane do typowej 6-cyfrowej wartości HEX, [ad]a0[0e]00[0e]00co powoduje, że ad0e0e pojawia się w powyższym jsfiddle.
Martin

3
Byłoby lepiej, gdyby ta odpowiedź zawierała tylko bieżący stan - historia tej odpowiedzi i innych odpowiedzi należy do podsumowań edycji i / lub komentarzy.
Peter Mortensen

397

Większość przeglądarek po prostu zignoruje wszelkie wartości NIE-szesnastkowe w łańcuchu kolorów, zastępując cyfry nieszesnastkowe zerami.

ChuCknorrisprzekłada się na c00c0000000. W tym momencie, przeglądarka będzie podzielić ciąg na trzy równe części, wskazując, Czerwony , Zielony i Niebieski wartości: c00c 0000 0000. Dodatkowe bity w każdej sekcji zostaną zignorowane, co daje końcowy wynik #c00000w kolorze czerwonawym.

Uwaga: nie dotyczy to analizy kolorów CSS, która jest zgodna 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>


7
Chociaż wciąż jestem ciekawy, dlaczego OP powiedział „w CSS”, a nie „w HTML” - może używają bardzo starej przeglądarki, lub po prostu się mylą?
Mike Christensen

7
Zatem jest bardziej niż prawdopodobne, że używa przestarzałego bgcoloratrybutu.
animuson

12
Nieprawidłowe postacie nie są pomijane, są traktowane jako 0.
traktuj swoje mody dobrze

5
(Kiedy ta odpowiedź może być martwa) sugestia: Zamiast tego użyj koloru tła, aby zademonstrować kolory. Kolor tekstu jest na tak małym obszarze względnym, że trudno dostrzec różnice lub podobieństwa
Zoe

304

Przeglądarka próbuje przekonwertować chucknorrisna kod koloru szesnastkowego, ponieważ nie jest to poprawna wartość.

  1. W chucknorris, wszystko oprócz cnie jest prawidłową wartością szesnastkową.
  2. Więc jest konwertowany na c00c00000000.
  3. Który staje się # c00000 , odcieniem czerwieni.

Wydaje się, że jest to problem przede wszystkim w Internet Explorerze i Operze (12), ponieważ zarówno Chrome (31), jak i Firefox (26) po prostu to ignorują.

PS Liczby w nawiasach to wersje przeglądarek, na których testowałem.

.

Na lżejszej nucie

Chuck Norris nie spełnia standardów internetowych. Standardy sieciowe są z nim zgodne. # BADA55


295

Powodem jest to, że przeglądarka nie może tego zrozumieć i spróbować w jakiś sposób przetłumaczyć go na to, co może zrozumieć, aw tym przypadku na wartość szesnastkową! ...

chucknorriszaczyna się od crozpoznanego znaku w systemie szesnastkowym, a także konwertuje wszystkie nierozpoznane znaki na 0!

Tak więc chucknorrisw formacie szesnastkowym staje się: c00c00000000wszystkie pozostałe znaki stają się 0i cpozostają tam, gdzie się znajdują ...

Teraz dzielą się przez 3 dla RGB(czerwony, zielony, niebieski) ... R: c00c, G: 0000, B:0000...

Ale wiemy, że poprawna wartość szesnastkowa dla RGB to tylko 2 znaki R: c0, G: 00, B:00

Tak więc prawdziwy wynik to:

bgcolor="#c00000";

Dodałem również kroki na obrazku jako szybkie odniesienie dla Ciebie:

Dlaczego HTML uważa, że ​​„chucknorris” jest kolorem?


23
To takie słodkie wytłumaczenie: D: D: D
Dominik Bucher,

2
Tak mądre i bardzo proste i proste wyjaśnienie, jakiego kiedykolwiek doświadczyłem
Saurin Vala

1
bardzo kreatywna odpowiedź :)
ahmednawazbutt

222

Specyfikacja WHATWG HTML 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 analizowania 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 analizowany jako cyfra szesnastkowa, a następnie jest przenoszony do 32-bitowej liczby całkowitej bez sprawdzania przepełnienia . Tylko osiem cyfr szesnastkowych mieści się w 32-bitowej liczbie całkowitej, dlatego brane są pod uwagę tylko ostatnie 8 znaków. Po przetworzeniu cyfr szesnastkowych na 32-bitowe liczby całkowite są one następnie obcinane do 8-bitowych liczb całkowitych, dzieląc je przez 16, aż zmieszczą się w 8-bitowe, dlatego zera wiodące są ignorowane.

Aktualizacja: ten kod nie jest dokładnie zgodny z definicją w specyfikacji, ale jedyną różnicą jest kilka linii kodu. Myślę, że to te linie zostały dodane (w Netscape 4):

if (bytes_per_val > 4)
{
      bytes_per_val = 4;
}

Dzięki, pokazałeś mi, gdzie jest stary kod źródłowy Netscape ... dlaczego tak trudno go znaleźć?
kb1000

202

Odpowiedź:

  • Przeglądarka spróbuje przekonwertować chucknorris na wartość szesnastkową.
  • Ponieważ cjest to jedyny prawidłowy znak szesnastkowy w chucknorris , wartość zmienia się w: c00c00000000( 0 dla wszystkich wartości, które były nieprawidłowe ).
  • Przeglądarka następnie dzieli wynik na 3 groupds: Red = c00c, Green = 0000, Blue = 0000.
  • Ponieważ prawidłowe wartości szesnastkowe dla tła html zawierają tylko 2 cyfry dla każdego typu koloru ( r , g , b ), ostatnie 2 cyfry są obcinane z każdej grupy, pozostawiając wartość rgb, c00000której kolor jest ceglasto-czerwonawy.

22

chucknorris zaczyna się na c , a przeglądarka odczytuje go do wartości szesnastkowej.

Ponieważ A, B, C, D, E i F są znakami szesnastkowymi .

Przeglądarka konwertuje chucknorrisdo wartości szesnastkowym C00C00000000.

Następnie C00C00000000wartość szesnastkowa jest konwertowana do formatu RGB (podzielona przez 3):

C00C00000000 => R:C00C, G:0000, B:0000

Przeglądarka potrzebuje tylko dwóch cyfr do wskazania koloru:

R:C00C, G:0000, B:0000=> R:C0, G:00, B:00=>C00000

Na koniec pokaż bgcolor = C00000w przeglądarce internetowej.

Oto przykład, który to pokazuje:

<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>


15

Te zasady przetwarzania kolorów atrybutów starszych wymaga dodatkowych czynności niż wymienione w istniejących odpowiedzi. Skrócony komponent do części dwucyfrowej jest opisany jako:

  1. Odrzuć wszystkie postacie oprócz ostatnich 8
  2. Odrzucaj wiodące zera jeden po drugim, o ile wszystkie składniki mają wiodące zero
  3. Odrzuć wszystkie postacie oprócz pierwszych 2

Kilka przykładów:

oooFoooFoooF
000F 000F 000F                <- replace, pad and chunk
0F 0F 0F                      <- leading zeros truncated
0F 0F 0F                      <- truncated to 2 characters from right

oooFooFFoFFF
000F 00FF 0FFF                <- replace, pad and chunk
00F 0FF FFF                   <- leading zeros truncated
00 0F FF                      <- truncated to 2 characters from right

ABCooooooABCooooooABCoooooo
ABC000000 ABC000000 ABC000000 <- replace, pad and chunk
BC000000 BC000000 BC000000    <- truncated to 8 characters from left
BC BC BC                      <- truncated to 2 characters from right

AoCooooooAoCooooooAoCoooooo
A0C000000 A0C000000 A0C000000 <- replace, pad and chunk
0C000000 0C000000 0C000000    <- truncated to 8 characters from left
C000000 C000000 C000000       <- leading zeros truncated
C0 C0 C0                      <- truncated to 2 characters from right

Poniżej znajduje się częściowa implementacja algorytmu. Nie obsługuje błędów ani przypadków, w których użytkownik wprowadza prawidłowy kolor.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.