Як запобігти відображенню символів Unicode як емоджи в HTML із JavaScript?


119

Я знаходжу Unicode для спеціальних символів з пошуку FileFormat.Info .

Деякі символи відображаються як класичні чорно-білі гліфи, наприклад ⚠ (попереджувальний знак \u26A0або ⚠). Вони є кращими, оскільки я можу застосувати до них стилі CSS (наприклад, кольорові).

зображення попереджувального гліфа

Інші візуалізують як новіші мультфільми смайлів, наприклад ⌛ (пісочний годинник \u231Bабо ⌛). Вони не є кращими, оскільки я не можу їх повністю стилізувати.

зображення смайлів пісочного годинника

Здається, що браузер вносить ці зміни, оскільки я можу бачити гліф пісочного годинника на Mac Firefox, тільки не Mac Chrome і Mac Safari.

Чи є спосіб змусити браузери відображати старіші (плоскі монотонні) версії для відображення?

Оновлення : здається (з коментарів нижче) є селектор текст презентація , FE0E, доступний для забезпечення тексту-проти-смайликів. Селектор об'єднується як суфікс без пробілу на код символу, наприклад, ⌛︎для шістнадцяткових HTML або \u231B\uFE0EJS. Однак, це просто не всім браузерам (наприклад, Chrome і Edge).


чи встановлено сімейство шрифтів у своїх правилах CSS?
G-Cyrillus

2
Можливий дублікат непослідовних
гліфів

1
@janaspage ︎і \uFE0Eправильні (2 і 8) і працюють добре в Safari (8 і 9), але, як і відповідь говорить: підтримка браузера плямиста, а Chrome (46) повністю порушена.
一 二三

2
Просто немає стандартного способу контролю за рендерінгом Emojis.
nwellnhof

1
Все, що вам потрібно зробити, - це застосувати шрифт, який містить гліфи для цих символів, і чиї гліфи виглядають так, як вам хочеться (без кольорів, без форм чи будь-якого іншого).
ShreevatsaR

Відповіді:


133

Додавання до вариационному селектору Unicode символу для вигонки тексту, VS15, ︎.
Це змушує попередній символ відображатись як текст, а не як символ Emoji.

<p>🔒&#xFE0E;</p>

Результат: 🔒︎

Дізнайтеся більше на: Символ Unicode як текст або смайли


1
Це дуже корисно, саме тому я його схвалив на днях. Цікаво, як я можу вставити смайлик і цей невидимий символ у рекламу у Facebook, яку я пишу? PS Це було також цікаво: apple.stackexchange.com/a/240450/53510
Ryan

3
Я просто зрозумів, що ця &#xFE0E;хитрість не працює для мене для певних шрифтів. Мені важко знайти шрифт, який я можу з розумом очікувати, що він буде встановлений на всіх машинах (Windows, iOS, Mac, Android тощо).
Райан

12
Це рішення насправді неприйнятне для символів, які можуть виникати навіть у полях введення. У мене виникають проблеми із символом ↔, який використовується в логіці, і я не можу за все життя зрозуміти, чому хтось думає, що це колись повинно бути емоджи!
frabjous

2
Наступна сторінка корисна для копіювання та вставлення цього спеціального символу відразу після емоджи, щоб він виглядав плоским, а не стилізованим. Наприклад, ви можете побачити 💬︎ замість 💬 і 🌟︎ замість 🌟 і ⌛︎ замість ⌛ і 🔒︎ замість 🔒 (залежно від вашого пристрою) unicode-symbol.com/u/FE0E.html
Ryan

15
Це відображається як смайлик у прикладі для мене, chrome 71 on mac 10.11.6.
lahwran

13

У мене був символ Юнікоду в contentз span::before, і я мав font-familyв spanнаборі для «Segoe UI Symbol». Але Chrome використовував "Segoe UI Emoji" як шрифт для його відтворення.

Однак, коли я встановив font-family"Segoe UI Symbol" явно для span::before, а не тільки для span, тоді він спрацював.


Це має бути правильною відповіддю, тим більше, що старий метод невидимих ​​символів не шанується більшістю основних браузерів.
Сара К. Корріхер

2

Для вирішення лише CSS для запобігання показу iOS емоджи, ви можете використовувати те, font-family: monospaceщо за замовчуванням є текстовим варіантом гліфа, а не варіантом емоджи.


1

Шрифти Android не багаті, як ви могли очікувати. У файлах шрифтів немає цих екзотичних гліфів, а Android має злом для кількох символів без гліфа. Їх замінюють ікони.

Тому рішення - інтегрувати сайт із веб-шрифтом (woff). Створіть новий файл шрифту за допомогою FontForge та виберіть потрібний гліф, наприклад, із безкоштовної серіфи TTF. Кожен гліф займає 1 к. Створити файл woff.

Підготуйте простий CSS для імпорту користувацького сімейства шрифтів.

style.css:

@font-face {
  font-family: 'Exotic Icons';
  src: url('exotic-icons.woff') format('woff');
}

.exotic-symbol-font {
    position: relative;
    top: 1px;
    display: inline-block;
    font-family: 'Exotic Icons';
    font-style: normal;
    font-weight: normal;
    line-height: 1;

    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

файл index.html:

<html>
  <head>
    <meta charset="utf-8">
    <link href="style.css" rel="stylesheet"></head>
    <title>Test custom glyphs</title>
  </head>
  <body>
    <table>
      <tr>
        <td class="exotic-symbol-font">
            😭  &#x2660; a  g
        </td>       
      </tr>
    </table>
  </body>
</html>

1

Якщо ваша основна проблема полягає в тому, щоб змусити монохроматичне відображення, щоб смайли не сильно виділялися з тексту, фільтри CSS, як окремо, так і в поєднанні з селектором варіації Unicode, можуть бути тим, що вам потрібно.

p.gscale { 
  -webkit-filter: grayscale(100%);
  filter: grayscale(100%);
}
a {
  color: #999;
  -webkit-filter: grayscale(100%) sepia(100%) saturate(400%) hue-rotate(170deg);
   filter: grayscale(100%) sepia(100%) saturate(400%) hue-rotate(170deg);
}
<p class="gscale">You've now got emoji display on 🔒lockdown🔒.</p>

<p>External Link: <a href="https://knowyourmeme.com/memes/party-hard">celebrate 🎉</a></p>

На відміну від селектора варіації, не має значення, як відображаються смайли, тому що фільтри CSS застосовуються до всього. (Я використовую їх для розмальовування сірого піктограми формату PNG у форматі "тип посилання" на гіперпосиланнях, які були модифіковані для вказівки на машину зворотного зв'язку.)

Тільки пам’ятайте про застереження . Ви не можете змінити фільтр батьківського елемента у дочірній, тому цю техніку не можна використовувати для розмальовування сірого абзацу та повторного розфарбовування посилань у ньому. 😢

... все-таки це корисно для ситуацій, коли ви або збираєтесь робити всю справу гіперпосиланням, або забороняєте багату розмітку всередині неї. (наприклад, назви та описи)

Однак це не буде працювати, якщо CSS фактично не застосується, тому я дам другий варіант, який є надійнішим у <title>елементах, ніж селектор варіації Unicode (дивлюсь на вас, GitHub. Мені не подобаються підроблені значки в моїй вкладки браузера):

Якщо ви додаєте в <title>елемент рядок, що надається користувачем , відфільтруйте смайли разом із будь-яким жирним / курсивним / підкресленням тощо. розмітка. (Так, для тих, хто цього пропустив, стандарт <title>вимагає, щоб вміст був простим текстом, окрім амперсанда та біг, а браузери я перевіряв усі теги інтерпретації як буквальний текст.)

Я думаю про два способи:

  1. Безпосередньо використовуйте вручну підтримуваний регулярний вираз, який відповідає блокам, куди найновіша версія Unicode розміщує свої емоджи та їх модифікатори.
  2. Ітерайте через кластери графеми та відкиньте будь-які, які містять розпізнані кодові точки смайлів. (Кластер графеми - це базовий гліф плюс усі діакритики та інші модифікатори, які складають видимий символ. Приклад, з яким я посилаюсь, використовує регекс-механізм Python для токенізації, а потім emojiпакет для бази даних, але Rust є хорошим прикладом мови де ітераційні кластери графеми - це швидко та легко за допомогою ящика unicode-segmentation.)

0

Google Chrome, настільна версія 75, схоже, розмежовує свій підхід до надання символів Unicode на основі першого втечі Unicode, з яким він стикається під час завантаження сторінки. Наприклад, під час розбору як першого втечі HTML Unicode у джерелі сторінки та немає еквівалента емоджи, & # 9207; Схоже, роз'яснює Chrome, що сторінка містить вхідні файли, які не повинні відображатися як емоджи.


0

Розширення на відповідь ssokolow , використання фільтра є приємним і принаймні робить контури видимими замість простого шрифту, але перетворення кольору RGB у послідовність фільтрів CSS дуже важко, коли потрібно використовувати певний колір.

Кращий (хоча і досить багатослівний) варіант - використовувати <feColorMatrix>фільтр SVG. У поєднанні з фільтром сірого масштабу та схемою URI даних ви можете представляти колір за допомогою RGB та вбудованого CSS:

.violet {
  color: white;
  filter: grayscale(100%) url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'><filter id='f'><feColorMatrix type='matrix' values='0.78 0 0 0 0  0 0.082 0 0 0  0 0 0.522 0 0  0 0 0 1 0'/></filter></svg>#f");
}

На жаль, ви не можете інтерполювати URL з даними (взяті з атрибутів чи змінних), але принаймні вам не потрібно обчислювати CSS-фільтри з RGB.


-2

Я не знаю способу вимкнути візуалізацію типу смайлів. Зазвичай я використовую шрифт значка, такий як шрифт awesome або glyphicons (постачається разом із Bootstrap 3).

Перевага їх використання над символами unicode полягає в тому, що

  1. ви можете вибрати з різних стилів, щоб він відповідав дизайну вашого сайту;
  2. вони є послідовними у веб-переглядачах (якщо ви коли-небудь намагалися робити символи зірки Unicode, ви помітите, що в IE порівняно з іншими браузерами він відрізняється);
  3. також вони повністю стилізовані, як символи Unicode, які ви намагаєтесь використовувати.

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


-2

Для мене на OSX рішенням було встановити сімейство шрифтів EmojiSymbols


-3

Жодне з вищезазначених рішень не працювало на розширення "Emoji для Google Chrome".

Отже, як вирішення, я зробив скріншот символу Unicode "BALLOT BOX With CHECK" (U + 2611) і додав його як зображення з php:

 $ballotBoxWithCheck='<img src="pics/U2611.png" style="height:11px;margin-bottom:-1px">'; # &#9745; or /U2611

введіть тут опис зображення

Дивіться: https://spacetrace.org/man_card.php?tec_id=21&techname=multi-emp-vessel


Майже напевно краще вставити його в Inkscape за допомогою текстового інструменту (з шрифтом, який має відповідну ліцензію), а потім запустити автоматичне відстеження, щоб ви могли отримати з нього SVG, який буде масштабуватися до будь-якого розміру, який вам потрібен. (Щоб зробити його якомога меншим, з'єднайте SVG мініфікатор з певним редагуванням вручну, щоб зменшити кількість вузлів у стежках, де автоматично простежується автовідстежка.)
ssokolow
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.