In den letzten Wochen hat Nikita Prokopov die Emoji-Unterstützung für Skija implementiert . Er beschloss, ein paar kleine Details darüber zu teilen, wie diese "größte Innovation in der menschlichen Kommunikation seit der Erfindung des Briefes
" unter der Haube funktioniert.
Anmerkung des Übersetzers: Habr unterstützt kein Emoji, daher musste ich aussteigen und Emoji durch Bilder ersetzen.
Unicode
Jedes Zeichen auf einem Computer ist mit einer Nummer codiert. Die beliebteste Codierung ist Unicode, und die beiden häufigsten Untervarianten sind UTF-8 und UTF-16.
Unicode weist 2 21 (2 Millionen) Zeichen zu, die als "Codepunkte" bezeichnet werden. Von diesen zwei Millionen sind derzeit nur ~ 150.000 Zeichen definiert. Alle Sprachen, tot und lebendig, und andere Dekorationen waren in diese 150.000 Symbole eingepfercht. Sie können verschiedene Schriftarten verwenden, um rückwärts und verkehrt herum zu schreiben: und
um «GHz» als einzelne Glyphe anzuzeigen :
.
Nach
rechts gerichtet Doppelpfeil mit Federn und zwei vertikalen Linien:
oder Semiglazov Monster :
. Und die Ente:
Achten Sie auf den Block mit ägyptischen Hieroglyphen (U + 13000 - U + 1342F), es gibt viele interessante Dinge:
Grundlegendes Emoji
Emoji sind nur Unicode-Zeichen, die sich hier U + 1F300-1F6FF und hier U + 1F900-1FAFF befinden:
Emoji verhält sich wie gewöhnliche Buchstaben, Sie können alle Operationen mit ihnen ausführen, wie mit Buchstaben ( ca. übersetzt: nur nicht auf Habré! ). Wenn Sie "A" eingeben, sieht der Computer U + 0041.
Während der Eingabe sieht der
Computer U + 1F335.
Emoji sind Schriftarten
Warum werden sie als Bilder angezeigt? Bitmap-Schriftarten. Sie können lustige PNG für Glyphen erstellen, anstatt langweilige Schwarz-Weiß-Vektoren zu erstellen.
Jedes Betriebssystem verfügt über eine vorinstallierte Emoji-Schriftart. Unter macOS / iOS ist dies das Apple Color Emoji. Windows - Segoe UI Emoji, Android - Noto Color Emoji.
Emojis sehen wie Schriftarten auf verschiedenen Geräten unterschiedlich aus. Einige Anwendungen haben ihre eigenen Emoji: WhatsApp, Twitter, Facebook.
Fallback-Schriftarten
Sie schreiben den Text in einer Schriftart. Wie passt das Emoji dort hin? Und warum sieht der russische Text im Clubhaus oder auf Medium schlecht aus?
Hier geben Sie das Zeichen U + 1F419 ein und Ihre Schriftart ist beispielsweise San Francisco. Die Schriftart in San Francisco enthält jedoch keine Glyphe für U + 1F419. Daher sucht Ihr Betriebssystem nach einer anderen Schriftart mit einer solchen Glyphe.
U + 1F419 ist nur in Apple Color Emoji verfügbar. Sie sehen also :
.
Unabhängig davon, welche Schriftart Sie verwenden, sehen Emojis gleich aus.
Variationswähler-16
Einige Emojis entstanden 1993 in Form von Symbolen in den Abschnitten Verschiedene Symbole U + 2600-26FF oder Dingbats U + 2700-27FF:
Diese Glyphen sind wie Buchstaben, schwarz und weiß. Viele Schriftarten haben ihre eigenen
(U + 2702 BLACK SCISSORS):
Apple Color Emoji hat eine eigene Version:
Woher weiß das Betriebssystem, was angezeigt werden soll
oder
ob es denselben U + 2702-Code hat?
Treffen Sie U + FE0F, auch bekannt als VARIATION SELECTOR-16. Dies ist ein Hinweis für den Textrenderer, auf Emoji umzuschalten.
Einfach, elegant und ohne Notwendigkeit, neue Codepunkte hervorzuheben.
haben die gleiche
Bedeutung , aber einen etwas anderen Bildstil.
Graphemcluster
Hier stehen wir vor einem anderen Problem - unsere Emoji sind jetzt nicht ein Codepunkt, sondern zwei. Dies bedeutet, dass wir einen Weg brauchen, um die Grenzen des Symbols zu definieren.
Eine Gruppe von Graphemen wird uns helfen. Ein Graphemcluster ist eine Folge von Codepunkten, die als einzelne vom Menschen lesbare Glyphe betrachtet wird.
Graphemcluster wurden nicht nur für Emojis erfunden, sondern gelten auch für reguläre Alphabete.
Ist ein einzelner Cluster von Graphemen, auch wenn er aus zwei Codepunkten besteht: U + 0055 UPPER-CASE U gefolgt von U + 0308 KOMBINIERENDE DIAERESE.
Graphemcluster sind für Programmierer sehr komplex. Das kannst du nicht einfach machen
substring(0, 10)
Um die ersten 10 Zeichen zu nehmen, können Sie das Emoji in zwei Hälften teilen.
Die Umkehrung der Linie muss geschickt gemacht werden. U + 263A U + FE0F ist sinnvoll, U + FE0F U + 263A jedoch nicht.
Schließlich können Sie nicht einfach einen
.length
String aufrufen . Nun, Sie können, aber das Ergebnis wird Sie überraschen. Wenn Sie Entwickler sind, versuchen Sie, es
in Ihrer Browserkonsole auszuführen.
Programmiertipp: Wenn Sie mit Text arbeiten, erstellen Sie eine Bibliothek, die sich auf Graphemcluster konzentriert. Für C, C ++ und JVM kann es sich um eine Intensivstation handeln . Swift macht standardmäßig alles richtig, für andere - machen Sie es selbst.
Dieses Ding ist 65 lang und kann nicht geteilt werden. Lebe jetzt damit.
Hautton-Modifikator
Die meisten menschlichen Emojis zeigen eine abstrakte gelbe Person. Als 2015 ein Hautton hinzugefügt wurde, wurden anstelle eines neuen Codepunkts für jede Kombination aus Emoji und Hautton nur fünf neue Codepunkte hinzugefügt: U + 1F3FB..U + 1F3FF.
Sie sollten nicht für sich allein verwendet, sondern hinzugefügt werden vorhandenes Emoji ... Zusammen bilden sie eine Ligatur: Wenn wir drucken
(U + 1F44B WAVING HAND SIGN) und dann (U + 1F3FD MEDIUM SKIN TONE MODIFIER), erhalten wir, dass es
keinen eigenen Codepunkt hat (dies ist eine Folge von zwei: U + 1F44B U + 1F3FD), hat aber ein einzigartiges Erscheinungsbild. Insgesamt wurden mit Hilfe von fünf Modifikatoren ~ 280 menschliche Emojis in 1680 Variationen umgewandelt. Hier sind einige Tänzer:
Tischler ohne Breite
Nehmen wir an, Ihre Freundin hat Ihnen gerade ein Foto von einem Apfel geschickt, den sie in ihrem Garten anbaut. Sie müssen antworten - wie? Sie können
WOMAN EMOJI (U + 1F469) mit dem angebrachten Reisblock (U + 1F33E)
senden
. Am Ende wird es funktionieren
, aber wenn Sie U + 200D zwischen sie schlagen, erhalten Sie einen Landwirt:
U + 200D heißt Zero-width Joiner, kurz ZWJ. Es funktioniert ähnlich wie das, was wir mit dem Hautton gesehen haben, aber dieses Mal können Sie zwei in sich geschlossene Emojis zu einem kombinieren. Nicht alle Kombinationen funktionieren, aber viele, manchmal auf überraschende Weise!
Einige Beispiele:
Eine seltsame Inkonsistenz, die mir aufgefallen ist, ist, dass die Haarfarbe über ZWJ erfolgt, während der Hautton nur ein Emoji-Modifikator ohne ZWJ ist. Warum? Ich habe keine Ahnung.
Leider sind einige Emojis nicht als Kombinationen mit ZWJ implementiert. Ich halte dies für eine verpasste Gelegenheit:
Wie drucke ich ZWJ? Auf keinen Fall. Aber Sie können es von hier kopieren: "". Hinweis: Dies ist ein Sonderzeichen. Erwarten Sie daher, dass es sich seltsam verhält. Du siehst ihn nicht, aber er ist es. ( Anmerkung per: im Originalartikel gibt es, aber Habr erlaubt nicht )
Ein weiterer großer Bereich, in dem ZWJ auf einem Pferd ist, ist die Konfiguration von Familien und Beziehungen. Hier ist eine kurze Geschichte zur Veranschaulichung:
Flaggen
Länderflags sind Teil des Unicode-Standards, werden jedoch aus irgendeinem Grund unter Windows nicht implementiert. Wenn Sie dies in einem Windows-Browser lesen - sorry!
Flags haben keine dedizierten Codepunkte. Stattdessen handelt es sich um Zwei-Buchstaben-Ligaturen.
Links - Windows, rechts - Mac
Richtig, sie verwenden keine echten Buchstaben. Stattdessen wird das Alphabet „Regional Indikator Symbol Buchstabe“ (U + 1F1E6..1F1FF) verwendet. Diese Buchstaben werden nur zum Erstellen von Flags verwendet.
Was passiert, wenn Sie zwei zufällige Buchstaben zusammenfügen? Nicht viel:
(außer dass sich die Textbearbeitung merkwürdig verhält).
Wenn Sie experimentieren möchten, können Sie dieses Alphabet kopieren und kombinieren:
Es gibt 258 gültige Kombinationen aus zwei Buchstaben. Kannst du sie alle finden?
Ein lustiger Nebeneffekt der Zwei-Buchstaben-Ligatur:
Sequenzen von Tags
Zwei-Buchstaben-Ligaturen sind cool, aber willst du nicht cooler sein? Wie wäre es mit 32 Buchstabenligaturen? Hier sind die Tag-Sequenzen.
Eine Tag-Sequenz ist eine Sequenz aus regulären Emoji, gefolgt von einer anderen Art lateinischer Buchstaben (U + E0020..E007E), die mit U + E007F CANCEL TAG endet.
Sie werden derzeit nur für diese drei Flaggen verwendet: England, Schottland und Wales:
Tastenkappen
Nicht besonders aufregend, aber der Vollständigkeit halber notwendig: Keycaps-Sequenzen verwenden eine andere Konvention.
Es sieht so aus: Nehmen Sie eine Zahl * oder #, verwandeln Sie sie mit U + FE0F in ein Emoji und wickeln Sie sie mit U + 20E3 COMBINING ENCLOSING KEYCAP in ein Quadrat ein
Es gibt 12 von ihnen:
Unicode-Updates
Unicode wird jedes Jahr aktualisiert und Emoji sind ein zentraler Bestandteil jeder Version. Beispielsweise wurden in Unicode 13 (März 2020) 55 neue Emojis hinzugefügt.
Zum Zeitpunkt dieses Schreibens unterstützen weder das neueste Mac OS (11.2.3) noch iOS (14.4.1) Emoji vom Typ Unicode 13: Folgendes
sehe ich im März 2021:
Aber dank der Magie von ZWJ kann ich es immer noch zu verstehen, was passiert, ist einfach nicht optimal.
Fazit
Zusammenfassend gibt es sieben Möglichkeiten, Emoji zu codieren:
- Einzelner Codepunkt

- Einzelner Codepunkt + Variationswähler-16

- Hautton-Modifikator

- Sequenzierung mit einem Joiner mit einer Breite von Null

- Flaggen

- Reihenfolge der Tags

- Tastenkappenfolge

Methoden von 1 bis 4 können kombiniert werden, um einen ziemlich komplexen Beitrag zu erstellen:
Wenn Sie Programmierer sind, denken Sie daran, die ICU-Bibliothek immer zu verwenden für:
- Extraktion von Teilstring
- Linienlängenmessungen
- Reverse String
Das Google-Schlüsselwort lautet "Grapheme Cluster". Dies gilt für Emojis, westliche Diakritika, induzierte und koreanische Schriftarten. Seien Sie also bitte vorsichtig.
- Russlands erstes serielles Steuerungssystem für einen Zweistoffmotor mit funktionaler Trennung der Steuerungen
- In einem modernen Auto gibt es mehr Codezeilen als ...
- Kostenlose Online-Kurse in Automobil, Luft- und Raumfahrt, Robotik und Ingenieurwesen (50+)
- McKinsey: Elektroniksoftware und Architektur in der Automobilindustrie überdenken
Über ITELMA
Liste nützlicher Veröffentlichungen zu Habré