Питання Чому HTML вважає "chucknorris" кольором?


Як же деякі випадкові рядки виробляють кольори при введенні у вигляді фонових кольорів у форматі HTML? Наприклад:

<body bgcolor="chucknorris"> test </body>

... виготовляє документ з червоний фон через всі браузери та платформи.

Цікаво, поки chucknorri випускає також червоний фон chucknorr виробляє жовтий фон.

Що відбувається тут?


6549
2017-11-29 22:54


походження


Як бічну примітку: не використовуйте bgcolor. Використовуйте CSS background. - John Dvorak
Чому ви коли-небудь хочете додати кольоровий фон, який називається chucknorris? Який був очікуваний колір? - masterFly
@ МастерФіл: Я не знаю, чому мій коментар за прийнятою відповіддю був видалений, оскільки він був "не конструктивним", оскільки він досить добре відповідає на ваше запитання: люди постійно експериментують із цими речами. Мені було лише 10 років, коли я дізнався про це, і все, що я робив у той час, засмучувало і бачив, що сталося. Ви не завжди повинні мати практичні підстави робити щось, особливо щось таке легковажне, як це. - BoltClock♦
і <body bgcolor="stevensegal"> тест </ body> зелений - Chris
Чудово! Я почну використовувати це зараз. Кожного разу, коли я намагаюся набрати червоний текст, він автоматично завершується, щоб перезаписати. PS google, якщо ви не знаєте історію. - Simon_Weaver


Відповіді:


Це затримка від днів Netscape:

Відсутні цифри розглядаються як 0 [...]. Невірна цифра просто інтерпретується як 0. Наприклад, значення # F0F0F0, F0F0F0, F0F0F, #FxFxFx та FxFxFx є однаковими.

Це з допису блогу Трохи про розгляд кольорів Microsoft Internet Explorer який охоплює його в деталях, включаючи різну довжину кольорових значень і т. д.

Якщо ми застосуємо правила по черзі з публікації блогу, ми отримаємо таке:

  1. Замініть всі недійсні шістнадцяткові символи на 0

    chucknorris becomes c00c0000000
    
  2. Покладіть до наступної загальної кількості символів, що підрозділяються на 3 (11 -> 12)

    c00c 0000 0000
    
  3. Розділити на три рівні групи, з кожним компонентом, що представляє відповідний колірний компонент кольору RGB:

    RGB (c00c, 0000, 0000)
    
  4. Урізати кожен аргумент від правого до двох символів

Що дає наступний результат:

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

Ось приклад демонстрації bgcolor атрибут у дії, щоб створити цей "дивовижний" зразок кольору:

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

Це також відповідає на іншу частину питання; чому bgcolor="chucknorr" виробляти жовтий колір? Ну, якщо застосовувати правила, то рядок:

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

Котрий дає світло-жовтий колір золота. Оскільки рядок починається з 9 символів, ми зберігаємо другий C цього разу, отже, він закінчується в остаточному колірному значенні.

Спочатку я зіткнувся з цим, коли хтось вказав, що можеш це зробити color="crap" і, добре, він виходить коричневий.


6051
2017-11-30 21:53



Зауважте, що, незважаючи на те, що повідомляє той блог, коли ви отримуєте обробку 3-х символьних рядків, ви дубльований кожен символ, а не додавання 0. тобто 0F6 стає #00FF66, ні #000F06. - Aaron Dufour
@usr: HTML побудований навмисне ігнорування неправильного введення;) - Kevin Ballard
Ви також можете використовувати мої випадковий рядок в CSS колір перетворювач, щоб отримати колір для певної строки. Вона заснована на 5 кроків для обчислення струнного кольору Джеремі Гуделла. - TimPietrusky
Прихована можливість для семантики? Ви можете зробити деякі сторінки помилок з цим: <body bgcolor=error><h1 style=text-align:center>Error: Not Found<h1></span> Ви можете додати розділ з аноним фоном або щось подібне, тому це не естетично шокує. - Theraot
@Теаот bgcolor="success" це гарна зелена теж. Цікаво, що ці кольори можна перевизначити за допомогою селекторів атрибута / значення CSS (наприклад, td[bgcolor="chucknorris"] {...}) - megaflop


Мені шкода незгоду, але згідно з правилами для аналізу спадкового колірного значення, розміщеного @ Юхонг Бао, chucknorris НЕ порівнює #CC0000, а навпаки #C00000, дуже схожий, але злегка відмінний відтінок червоного кольору. Я використав Firefox ColorZilla надбудова щоб це підтвердити.

Правила передбачають:

  • зробити рядок довжиною, кратною 3, додавши 0s: chucknorris0
  • відокремте рядок на 3 рівні рядки: chuc knor ris0
  • урізати кожен рядок на 2 символи: ch kn ri
  • зберігайте значення шістнадцяткового значення та додавайте 0, де це необхідно: C0 00 00

Я зміг використати ці правила, щоб правильно інтерпретувати наступні рядки:

  • LuckyCharms
  • Luck
  • LuckBeALady
  • LuckBeALadyTonight
  • GangnamStyle 

UPDATE: Початкові відповіді, які заявили, що колір був #CC0000 з тих пір редагували свої відповіді, щоб включити корекцію.


829
2017-10-17 17:55



Я зрозумів це, що я неправильно зрозумів деякі з синтаксичних інструкцій: "adamlevine" = "ada00e000e" = "ada00e000e00" = "ada0 0e00 0e00" = "ad 0e0e" - ідеально !! - Jeremy Goodell
Якщо ви зацікавлені, я опублікував 5-кроковий алгоритм як UPDATE на подібне питання, яке я опублікував сьогодні: stackoverflow.com/questions/12939234/... - Jeremy Goodell
@TimPietrusky створив цей freaking неймовірний демонстраційний інструмент для випадкових імен кольорів. Просто йди сюди: randomstringtocsscolor.com і клацніть у полі та введіть "chucknorris". - Jeremy Goodell
adamlevine працює як на jsfiddle.net/LdyZ8/2959 але листи заблоковані ada00e000e який доповнений ada00e000e00 але потім зменшується до типового 6-значного значення HEX [ad]a0[0e]00[0e]00 таким чином роблячи ad0e0e, що з'являється у jsfiddle вище. - Martin
Було б краще, якщо б це відповісти тільки містив поточний стан - історія цієї відповіді та інші відповіді належать до резюме резюме та / або коментарів. - Peter Mortensen


Більшість браузерів просто ігнорують будь-які значення NEXXX у вашій колірній рядку, замінюючи несексові цифри нулями.

ChuCknorris перекладається на c00c0000000. У цьому пункті браузер розділить рядок на три рівних розділи, що вказують Червоний, Зелений і Синій значення: c00c 0000 0000. Додаткові біти в кожному розділі будуть ігноруватися, що робить кінцевий результат #c00000 який є червонуватим кольором.

Зауважте, це робиться ні застосовуються до аналізу кольорів CSS, які відповідають стандарту 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>


338
2017-11-29 23:01



Хоча мені все ще цікаво, чому OP сказав "у CSS", а не "в HTML" - можливо, вони використовують супер старий браузер або просто помиляються? - Mike Christensen
Тож він більше ніж імовірно, використовуючи застарілу bgcolor атрибут - animuson♦
Можливо, він буде так люб'язно розміщувати цей чарівний HTML-код, який створює червоний папір Чака Норріса через "всі браузери та платформи". - Mike Christensen
Недійсні символи не пропускаються, їх обробляють як 0. - phyzome
(WHI ця відповідь може бути мертвою) пропозиція: замість цього використовувати фоновий колір, щоб продемонструвати кольори. Колір тексту над такою невеликою відносною площею важко бачити відмінності або схожість - Zoe


Браузер намагається перетворити chucknorris в шістнадцятковий код кольору, оскільки це не є дійсним значенням.

  1. В chucknorris, все окрім c не є дійсним значенням hex.
  2. Так він перетворюється на c00c00000000.
  3. Що станеться # c00000, відтінок червоного кольору.

Це, здається, є проблемою в першу чергу Internet Explorer і Опера (12) як Chrome (31), так і Firefox (26) просто ігнорують це.

П.С. Цими в квадратних дужках є версії браузера, які я протестував.

.

На більш легкій ноті

Чак Норріс не відповідає веб-стандартам. Веб-стандарти відповідають   йому. # BADA55


220
2017-11-30 14:05





HTML специфікація WHATWG має точний алгоритм для аналізу застарілого значення кольору: https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-legacy-colour-value

Код Netscape Classic, який використовується для аналізу колірних рядків, є відкритим вихідним кодом: https://dxr.mozilla.org/classic/source/lib/layout/layimage.c#155

Наприклад, зверніть увагу, що кожен символ аналізується як шістнадцяткова цифра, а потім переміщується у 32-розрядне ціле число без перевірки на переповнення. Тільки вісім шістнадцятиричних цифр вписуються в 32-бітове ціле, тому розглядаються лише останні 8 символів. Після розбору шістнадцятиричних цифр на 32-бітні цілі числа вони потім усуваються у 8-бітні цілі числа, розділяючи їх на 16, поки вони не вписуються в 8-бітний, тому провідні нулі ігноруються.

Оновлення: цей код не точно відповідає тому, що визначено в специфікації, але єдиною різницею є кілька рядків коду. Я думаю, що ці рядки були додані (в Netscape 4):

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

187
2017-09-27 22:01





Відповідь: 

  • Браузер спробує перетворити Чак Норріс в шістнадцяткове значення.
  • З тих пір c є єдиним дійсним шістнадцятковим символом у Чак Норріс, значення перетворюється на: c00c00000000(0 для всіх невірних значень)
  • Браузер потім розподіляє результат на 3 групи: Red = c00c, Green = 0000, Blue = 0000.
  • Оскільки дійсні значення hex для html-фонів містять лише 2 цифри для кожного типу кольорів (р, г, б), останні 2 цифри скорочуються з кожної групи, залишаючи значення rgb c00000 який являє собою цегляно-червонувато-тоноване забарвлення.

167
2018-05-24 05:18





Причина в тому, що браузер може не розуміти це і спробуйте якось перекласти його на те, що він може зрозуміти, і в цьому випадку в шістнадцяткове значення!

chucknorris починається з c який визнаний символ у шістнадцятковій, також перетворює всі нерозпізнані символи в 0!

Так chucknorris в шістнадцятковому форматі стає: c00c00000000, всі інші персонажі стають 0 і c залишається там, де вони ...

Тепер вони ділять на 3 на RGB(червоний, зелений, синій) ... R: c00c, G: 0000, B:0000...

Але ми знаємо, дійсний шістнадцятковий код для RGB - всього 2 символи, значить R: c0, G: 00, B:00

Тому реальний результат:

bgcolor="#c00000";

Я також додав кроки на зображенні як швидку довідку:

Why does HTML think “chucknorris” is a color?


135
2017-07-01 04:08



Схоже, що скаже Баки - Tushortz
@Тушторц, хто є баккі? - Goku
@Goku Bucky це смішний підручник з програмування Youtube guy, який йде ручкою "thenewboston" - Tushortz