Come evitare che i caratteri Unicode vengano visualizzati come emoji in HTML da JavaScript?


119

Sto trovando Unicode per caratteri speciali dalla ricerca di FileFormat.Info .

Alcuni caratteri vengono visualizzati come i classici glifi in bianco e nero, come ⚠ (segnale di avvertimento \u26A0o ⚠). Questi sono preferibili, poiché posso applicare loro stili CSS (come il colore).

immagine del glifo di avvertenza

Altri vengono visualizzati come emoji a fumetti più recenti, ad esempio ⌛ (clessidra \u231Bo ⌛). Questi non sono preferibili, poiché non posso modellarli completamente.

immagine di emoji a clessidra

Sembra che il browser stia apportando questa modifica, dal momento che sono in grado di vedere il glifo della clessidra su Mac Firefox, ma non su Mac Chrome né su Mac Safari.

C'è un modo per forzare i browser a visualizzare le versioni meno recenti (monotono piatte) da visualizzare?

Aggiornamento : Sembra (da commenti qui sotto) c'è un selettore di presentazione del testo , FE0Edisponibile di far rispettare il testo-vs-emoji. Il selettore viene concatenato come suffisso senza spazio sul codice del carattere, ad esempio ⌛︎per HTML hex o \u231B\uFE0Eper JS. Tuttavia, semplicemente non è onorato da tutti i browser (ad esempio Chrome e Edge).


imposti una famiglia di caratteri nelle tue regole CSS?
G-Cyrillus


1
@janaspage ︎e \uFE0Esono corretti (2 e 8) e funzionano bene in Safari (8 e 9), ma come dice la risposta: il supporto del browser è imprevedibile e Chrome (46) è completamente rotto.
一 二三

2
Semplicemente non esiste un modo standard per controllare il rendering di Emoji.
nwellnhof

1
Tutto quello che devi fare è applicare un carattere che contenga glifi per questi caratteri e i cui glifi abbiano l'aspetto che desideri (senza colori, senza forme o come preferisci).
ShreevatsaR

Risposte:


133

Aggiungere la variazione selettore Unicode caratteri per forzare il testo, VS15, ︎.
Ciò forza il rendering del carattere precedente come testo anziché come simbolo Emoji.

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

Risultato: 🔒︎

Ulteriori informazioni su: simbolo Unicode come testo o emoji


1
Questo è molto utile, motivo per cui l'ho votato per favore l'altro giorno. Mi chiedo come posso incollare un'emoji e questo personaggio invisibile in un annuncio di Facebook che sto scrivendo? PS Anche questo era interessante: apple.stackexchange.com/a/240450/53510
Ryan

3
Mi sono appena reso conto che questo &#xFE0E;trucco non funziona per me per alcuni caratteri. Faccio fatica a trovare un font che posso ragionevolmente aspettarmi di essere installato su tutte le macchine (Windows, iOS, Mac, Android, ecc.).
Ryan

12
Questa soluzione non è davvero accettabile per i simboli che possono anche verificarsi nei campi di input. Ho questo problema con il simbolo ↔ usato nella logica e non riesco a capire perché qualcuno pensi che dovrebbe mai essere un'emoji!
frabjous

2
La pagina seguente è utile per copiare e incollare quel carattere speciale subito dopo un'emoji per farlo sembrare piatto piuttosto che stilizzato. Ad esempio potresti vedere 💬︎ invece di 💬 e 🌟︎ invece di 🌟 e ⌛︎ invece di ⌛ e 🔒︎ invece di 🔒 (a seconda del dispositivo) unicode-symbol.com/u/FE0E.html
Ryan

15
Questo viene visualizzato come emoji nell'esempio per me, chrome 71 su mac 10.11.6.
lahwran

13

Avevo un carattere Unicode nel contentdi a span::before, e avevo font-familyil spanset di "Segoe UI Symbol". Ma Chrome ha utilizzato "Segoe UI Emoji" come carattere per renderlo.

Tuttavia, quando ho impostato il font-family"Segoe UI Symbol" esplicitamente per span::before, piuttosto che solo per span, allora ha funzionato.


Questa dovrebbe essere la risposta corretta, soprattutto perché il vecchio metodo dei caratteri invisibili non è rispettato dalla maggior parte dei principali browser.
Sarah C. Corriher

2

Affinché una soluzione solo CSS impedisca a iOS di visualizzare emoji, puoi utilizzare l' font-family: monospaceimpostazione predefinita per la variante di testo del glifo piuttosto che per la variante emoji.


1

I caratteri Android non sono ricchi come ci si potrebbe aspettare. I file dei caratteri non hanno questi glifi esotici e Android ha un trucco per pochi caratteri senza glifo. Sono sostituiti da icone.

Quindi la soluzione è integrare il sito con un carattere web (woff). Crea un nuovo file di font con FontForge e scegli il glifo richiesto da TTF serif gratuito, ad esempio. Ogni glifo richiede 1k. Genera file woff.

Prepara un semplice CSS per importare la famiglia di caratteri personalizzati.

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

file 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

Se la tua preoccupazione principale è forzare la visualizzazione monocromatica in modo che le emoji non risaltino troppo dal testo, i filtri CSS, da soli o in combinazione con il selettore di variazione Unicode, potrebbero essere qualcosa che desideri.

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>

A differenza del selettore di variazione, non dovrebbe importare come vengono renderizzate le emoji, perché i filtri CSS si applicano a tutto. (Li uso per le icone "tipo di collegamento" in formato PNG in scala di grigi su collegamenti ipertestuali che sono stati modificati per puntare alla Wayback Machine.)

Fai solo attenzione all'avvertenza . Non puoi sovrascrivere il filtro di un elemento genitore in un figlio, quindi questa tecnica non può essere utilizzata per scalare un paragrafo in scala di grigi, quindi ricolorare i collegamenti al suo interno. 😢

... tuttavia, è utile per le situazioni in cui renderai l'intera cosa un collegamento ipertestuale o non consentirai un markup ricco al suo interno. (es. titoli e descrizioni)

Tuttavia, questo non funzionerà a meno che CSS non venga effettivamente applicato, quindi fornirò una seconda opzione che è più affidabile negli <title>elementi rispetto al selettore di variazione Unicode (ti sto guardando GitHub. Non mi piacciono le icone false nel mio schede del browser):

Se stai inserendo una stringa fornita dall'utente in un <title>elemento, filtra l'emoji insieme a qualsiasi grassetto / corsivo / sottolineato / ecc. markup. (Sì, per coloro che lo hanno perso, lo standard richiede che il contenuto di <title>sia testo normale a parte gli escape della e commerciale ei browser che ho testato interpretano tutti i tag all'interno come testo letterale.)

I due modi in cui posso pensare sono:

  1. Usa direttamente un'espressione regolare gestita manualmente che corrisponda ai blocchi in cui la versione più recente di Unicode inserisce le sue emoji e i loro modificatori.
  2. Itera attraverso i grapheme cluster e scarta quelli che contengono punti di codice emoji riconosciuti. (Un grapheme cluster è un glifo di base più tutti i segni diacritici e altri modificatori che compongono il carattere visibile. L'esempio a cui mi collego usa il motore regex di Python per tokenizzare e quindi il emojipacchetto per il database, ma Rust è un buon esempio di linguaggio dove l'iterazione di grapheme cluster è semplice e veloce tramite una cassa come unicode-segmentation.)

0

Google Chrome, versione desktop 75, sembra disambiguare il suo approccio al rendering dei caratteri Unicode in base al primo escape Unicode che incontra durante il caricamento di una pagina. Ad esempio, se analizzato come primo escape HTML Unicode in una sorgente di pagina e non ha un equivalente emoji, & # 9207; sembra chiarire a Chrome che la pagina contiene escape da non renderizzare come emoji.


0

Espandendo la risposta di ssokolow , l'uso di un filtro è bello e almeno rende visibili i contorni invece di usare un semplice carattere, ma convertire un colore RGB in una sequenza di filtri CSS è molto difficile quando si desidera utilizzare un colore specifico.

Un'opzione migliore (anche se piuttosto prolissa) è usare il <feColorMatrix>filtro SVG. In combinazione con il filtro in scala di grigi e lo schema dell'URI dei dati, puoi rappresentare il colore tramite RGB e CSS in linea:

.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");
}

Sfortunatamente, non puoi interpolare l'URL con i dati (presi da attributi o variabili), ma almeno non devi calcolare i filtri CSS da RGB.


-2

Non conosco un modo per disattivare il rendering del tipo di emoji. Di solito utilizzo un carattere icona come font awesome o glyphicons (viene fornito con Bootstrap 3).

Il vantaggio di usarli sui caratteri Unicode è quello

  1. puoi scegliere tra molti stili diversi in modo che si adatti al design del tuo sito;
  2. sono coerenti su tutti i browser (se hai mai provato a creare un personaggio stella unicode, noterai che è diverso in IE rispetto ad altri browser);
  3. inoltre, sono completamente personalizzabili, come i caratteri Unicode che stai cercando di utilizzare.

L'unico aspetto negativo è che è un'altra cosa che il browser deve scaricare quando visualizza la tua pagina.


-2

Per me su OSX la soluzione era impostare la famiglia di caratteri su EmojiSymbols


-3

Nessuna delle soluzioni sopra ha funzionato per l'estensione "Emoji per Google Chrome".

Quindi, come soluzione alternativa, ho fatto uno screenshot del carattere Unicode 'BALLOT BOX WITH CHECK' (U + 2611) e l'ho aggiunto come immagine con php:

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

inserisci qui la descrizione dell'immagine

Vedi: https://spacetrace.org/man_card.php?tec_id=21&techname=multi-emp-vessel


Quasi sicuramente meglio incollarlo in Inkscape usando lo strumento di testo (con un font che ha una licenza adatta selezionata) e quindi eseguire un'auto-traccia, in modo da poter ottenere un SVG da esso che si ridimensionerà a qualsiasi dimensione tu abbia bisogno. (Per renderlo il più piccolo possibile, abbina un minifier SVG con alcune modifiche manuali per ridurre il numero di nodi nei percorsi in cui l'auto-trace ha sbagliato.)
ssokolow
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.