Eine naive Zählung ergibt 8.

    • Ephera@lemmy.ml
      link
      fedilink
      Deutsch
      arrow-up
      11
      ·
      edit-2
      4 days ago

      Kann dir jetzt nicht die genaue Zahl erklären, aber viele Emojis setzen sich aus mehreren Zeichen zusammen. Der 👩🏻-Emoji setzt sich zum Beispiel vermutlich so irgendwie zusammen: 🧑♀️🏻

      Zwischen den Einzelemojis müssen nochmal weitere Zeichen sein, damit sowas kombiniert werden kann, sogenannte “Zero-Width Joiner”: https://en.wikipedia.org/wiki/Zero-width_joiner

      Also je nach Zählweise könnte das 👩🏻-Emoji eben 1 Zeichen oder 3 Zeichen oder 5 Zeichen sein.

      Und dabei lasse ich jetzt noch außen vor, dass manche Programmiersprachen die Bytes zählen, um die vermeintliche Anzahl der Zeichen zu bestimmen, was dann nochmal deutlich mehr sind.

    • bleistift2@sopuli.xyzOP
      link
      fedilink
      Deutsch
      arrow-up
      6
      ·
      4 days ago

      Wir reden von diesem Post: https://feddit.org/post/21517777

      Die Sprache meiner Wahl ist JavaScript. Ich habe in _t den Teil des Titels geladen, der nicht „ich” oder „iel“ ist. Zuerst fällt auf, dass die Längenangabe von JavaScript völlig nutzlos ist:

      _t.length
      > 13
      

      Wie kommt das Zustande? @Ephera@lemmy.ml kommt der Sache schon nahe. JS benutzt intern 16-bit-Zeichen und zählt die, um die Länge dieses Strings zu ermitteln. Die Emoji in dem Titel haben aber teilweise eine Repräsentation, die mehr als 16 Bit braucht. Schauen wir uns die Unicode Code Points von _t an:

      [..._t].map(c => `${c} (0x${c.codePointAt(0).toString(16)})`)
      > ['👩 (0x1f469)', '🏻 (0x1f3fb)', '🛒 (0x1f6d2)', '💂 (0x1f482)',
      >  '🏻 (0x1f3fb)', '‍ (0x200d)', '♀ (0x2640)', '️ (0xfe0f)']
      

      Alles, was größer ist als 0xFFFF passt nicht in ein 16-bit-Zeichen. Das sind die ersten 5 Zeichen. Die zählen also für die Länge doppelt. So kommt zumindest JavaScript auf 13.

      Aber wir wollen ja nicht die Anzahl der 16-bit-Zeichen zählen. Also weiter im Text. Im letzten Code-Block siehst du schon, dass es 8 Unicode-Codepunkte sind, die dieser String repräsentiert. Das ist meine „naive” Zählung. Aber die ist natürlich auch falsch.

      Unicode erlaubt sogenannte Modifier an Emoji. Das zweite Zeichen (0x1f3fb) wird nicht selbst angezeigt, sondern verändert nur das vorangegangene Zeichen. In dem Fall macht es aus dem generischen “Woman Emoji” eine hellhäutige Frau. Das ist so ähnlich wie mit Akzent-Zeichen. Wenn auf ein „`“ ein „a“ folgt, sind das auch nicht zwei Zeichen, sondern das Zeichen „à“. Modifier darf man also nicht zählen. Dadurch fallen schon einmal 2 Codepunkte weg. Wir haben also jetzt eine hellhäutige Frau, einen Einkaufswagen und eine hellhäutige Wache. Was geht jetzt bei den letzten drei Zeichen ab?

      0x200d ist ein Arschloch. Es handelt sich um den Zero Width Joiner (ZWJ). Der hat den Effekt, dass das nächste Zeichen, selbst wenn es eigentlich alleine stehen könnte, mit dem vorherigen kombiniert wird. Wir haben als nächstes Zeichen den Spiegel der Venus. Der ZWJ sorgt nun dafür, dass der auch nicht angzeigt wird, sondern wie ein Modifier auf die hellhäutige Wache wirkt. Die wird dadurch zur weiblichen, hellhäutigen Wache. Weder der ZWJ noch das zum Modifier erklärte Zeichen dürfen gezählt werden.

      Es bleibt das letzte Zeichen, 0xFE0F. Wenn man Unicode fragt, sagen die einem, dass das der Variant Selector 16 ist. Variant Selectors kommen nur in asiatischen Sprachen vor. Da kann es für dasselbe Zeichen mehrere verschiedene Arten geben, es zu schreiben, die die Bedeutung des Zeichens aber nicht verändern. Die Variant Selectors erlauben es dem Schreiber eines Textes, zu bestimmen, wie ein Zeichen zu malen ist.

      Emoji haben diese Variant Selectors gekapert. Variante 15 sorgt dafür, dass ein Zeichen, das eigentlich ein Emoji ist (d.h. bunt angezeigt wird), wie eine Text-Glyphe dargestellt wird. Aus wird so ♥. Variante 16 (die wir hier vorliegen haben) macht das Gegenteil und sorgt dafür, dass ein „normales” Zeichen emojisiert (bunt) wird.

      Anscheinend (ich bin mir wirklich nicht sicher, weil der Unterschied nur ca. 6 Pixel sind) muss der Spiegel der Venus emojisiert werden, damit der ZWJ ihn an die Wache kleben kann. Hier der Vergleich: 💂🏻ohne den Variantenselektor; 💂🏻‍♀️ mit).

      Was zählt, ist aber dass die Variantenselektoren auch niemals abgebildet werden und deshalb nicht als Bildzeichen zählen.

      So werden aus 13 Doppelbytes 8 Zeichen und 3 Bilder.

  • anton@lemmy.blahaj.zone
    link
    fedilink
    arrow-up
    1
    ·
    4 days ago

    Aber die 8 Vereintkodierungskodepunkte ergeben nur 3 Schreibdingsklumpen und darauf kommt es doch im Titel an, oder?