it-swarm.com.de

Warum hat emoji zwei verschiedene utf-8-Codes? Wie konvertiere ich emoji von utf-8, benutze NSString in ios?

Wir haben ein Problem gefunden, dass einige Emojis zwei utf-8-Codes haben, wie zum Beispiel:

emoji   unicode    utf-8                another utf-8
????      U+1F601    \xf0\x9f\x98\x81     \xed\xa0\xbd\xed\xb8\x81

Die Sprache ios kann den anderen Typ von utf-8 jedoch nicht decodieren. Dies führt zu einem Fehler, wenn ich den String von utf-8 decodiere.

 ios code


In allen Dokumenten, die ich gefunden habe, kann ich nur einen Typ von utf-8-Code für ein Emoji finden, nicht den anderen.

Dokumente, auf die ich verwiesen habe, umfassen:

Emoji-Code-Link

ganze utf-8-Codelink

In einem Web-Tool bianma können jedoch alle zwei Arten von utf-8-Code korrekt in Emoji konvertiert werden.

 input code

 ouput


Meine Frage ist also:

  1. Warum gibt es zwei Arten von utf-8-Codes für einen Emoji?

  2. Wo ist ein Dokument, das die beiden Arten von utf-8-Codes enthält?

  3. Wie konvertiert man den String von utf-8 korrekt mit NSString in der ios-Sprache?

9
pinchwang

0xF0, 0x9F, 0x98, 0x81

Ist die korrekte UTF-8-Kodierung für U + 1F601 ????.

0xED, 0xA0, 0xBD, 0xED, 0xB8, 0x81

Ist keine gültige UTF-8-Sequenz (*). Es sollte wirklich abgelehnt werden. iOS ist richtig, dies zu tun.

Dies ist ein Fehler im bianma-Tool: Die convertUtf8BytesToUnicodeCodePoints-Funktion ist einfühlsamer als der angegebene Algorithmus in z. B. RFC 3629 .

Dadurch wird eine Arbeitszeichenfolge nur zurückgegeben, weil das Tool in JavaScript geschrieben ist. Nach Dekodierung der obigen Bytefolge in die gefälschte Ersatzcode-Punktfolge U + D83D konvertiert U + DE01 diese in eine JavaScript-Zeichenfolge unter Verwendung einer direkten Codepunkt-Code-Einheit-Zuordnung, die \uD83D\xDE01 ergibt. Da dies der richtige Weg ist, zu kodieren ???? In einem UTF-16-String scheint es funktioniert zu haben.

(*: It ist eine gültige CESU-8-Sequenz, aber diese Kodierung ist nur "falsche Kodierung wegen Kompatibilität mit schlecht geschriebenen historischen Werkzeugen" und sollte generell vermieden werden.)

Sie sollten normalerweise nicht auf eine solche Sequenz treffen. Es ist in der Regel nicht wert, darauf zu achten, es sei denn, Sie haben eine bestimmte Quelle für diese Art von fehlerhaften Daten, für die Sie nicht in der Lage sind, repariert zu werden.

9
bobince

Dies funktionierte für mich in PHP, um eine Nachricht mit Emoji an den Telegramm-Bot zu senden: 

$message_text = " \xf0\x9f\x98\x81 ";
0
Polina