Emoji Problem mit json_decode

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

loddarmattheus

Erfahrenes Mitglied
Hallo Leute,
ich lese Nachrichten mittels
PHP:
$input=file_get_contents('php://input');
$data=json_decode($input);
ein, welche u.a. auch Emojis enthalten wie dieses hier beispielsweise:
1658400069280.png
Das Blöde ist nur, dieses Target-Emoji sieht bei mir in der Database dann so aus:
Code:
🎯

Ich kann es auch nicht in $data suchen und ersetzen mittels str_replace und es hilft auch nichts, wenn ich im json_decode ein JSON_UNESCAPED_UNICODE einfüge.
Wie bekommt man denn diese kryptischen Zeichen ersetzt (oder gelöscht)?
 

Anhänge

  • 1658400059677.png
    1658400059677.png
    1,4 KB · Aufrufe: 1

Sempervivum

Erfahrenes Mitglied
Interessante Frage.

Ich finde da etwas in Javascript für das Handling von Emojis:
unicode-emoji-toolkit/index.js at master · N-Shar-ma/unicode-emoji-toolkit
Wusste ich auch noch nicht, dass Regex Emojis unterstützt.
Dein Code ist zwar PHP aber wenn ich mir ansehe wie Du das $input einliest, könnte es sein, dass es vom Browser kommt und dann könntest Du es auch mit JS bearbeiten.

Spaßeshalber habe ich versucht, ob das Pattern für die Emojis auch in PHP funktioniert aber dort bekomme ich Fehler.

Bei Stackoverflow wird jedoch eine Methode vorgestellt in PHP: Ein Muster für die zugelassenen Zeichen definieren und alles heraus filtern, was darin nicht enthalten ist:
PHP Regex Strip Away All Emojis
(gleich die erste Antwort von Bruno)
 
Zuletzt bearbeitet:

loddarmattheus

Erfahrenes Mitglied
Danke für die richtige Richtung. Lösung:
PHP:
$pattern = "~[^a-zA-Z0-9_ !@#$%^&*();\\\/|<>\"'+.,:?=-]~";
$message = preg_replace($pattern,"",$text);

Sämtliche Emojis etc. werden hiermit entfernt und es bleibt nur der reine Text übrig.
 

Sempervivum

Erfahrenes Mitglied
Hast Du dabei auch Umlaute berücksichtigt? Der Platzhalter \p{L} in der Lösung von Bruno, berücksichtigt diese ebenso wie Sonderzeichen in anderen europäischen Sprachen. Bis hin zu chinesischen Schriftzeichen, was für dich allerdings weniger relevant sein dürfte.
 

Technipion

Erfahrenes Mitglied
Ich vermute ehrlichgesagt, dass du irgendeinen grundlegenden Fehler beim Datenbankmanagment bezüglich der Kodierung machst.

Grundsätzlich gilt: Das Internet ist Unicode.
Nun hat aber leider eine gewisse winzigweiche Firma auf der ganzen Welt Fenster verbreitet, die alles Mögliche zur Enkodierung benutzen - außer eben den globalen Standard UTF-8.

Ganz wichtig: Das hier lesen und verstehen.

Dein Target Emoji ist U+1F3AF. Das entspricht den 4 Bytes "0xF0 0x9F 0x8E 0xAF". Was du da auf deinem Bildschirm angezeigt bekommst - sehr wahrscheinlich auf Windows - ist der Target Emoji.
Etwas Python-Zauberei bestätigt das:
Bash:
$ python -c "print(bytes.fromhex('f0 9f 8e af').decode('cp1252'))"
🎯
$
Er wurde allerdings in seine 4 Bytes zerlegt und diese dann mittels Codepage 1252 rekodiert.

Ich würde an deiner Stelle aber vermutlich alles auf UTF-8 umstellen.

Gruß Technipion
 

Jan-Frederik Stieler

Monsterator
Moderator
Ich vermute ehrlichgesagt, dass du irgendeinen grundlegenden Fehler beim Datenbankmanagment bezüglich der Kodierung machst.

Grundsätzlich gilt: Das Internet ist Unicode.
Nun hat aber leider eine gewisse winzigweiche Firma auf der ganzen Welt Fenster verbreitet, die alles Mögliche zur Enkodierung benutzen - außer eben den globalen Standard UTF-8.

Ganz wichtig: Das hier lesen und verstehen.

Dein Target Emoji ist U+1F3AF. Das entspricht den 4 Bytes "0xF0 0x9F 0x8E 0xAF". Was du da auf deinem Bildschirm angezeigt bekommst - sehr wahrscheinlich auf Windows - ist der Target Emoji.
Etwas Python-Zauberei bestätigt das:
Bash:
$ python -c "print(bytes.fromhex('f0 9f 8e af').decode('cp1252'))"
🎯
$
Er wurde allerdings in seine 4 Bytes zerlegt und diese dann mittels Codepage 1252 rekodiert.

Ich würde an deiner Stelle aber vermutlich alles auf UTF-8 umstellen.

Gruß Technipion
An ein UTF-8 Problem hatte ich auch als erstes gedacht als ich schon die Überschrift gelesen habe.
 

loddarmattheus

Erfahrenes Mitglied
Ich vermute ehrlichgesagt, dass du irgendeinen grundlegenden Fehler beim Datenbankmanagment bezüglich der Kodierung machst.
Guten Morgen,
also meine MySQL Kollation ist in sämtlichen Tabellen auf UTF8-unicode eingestellt, aber ehrlich gesagt weiß ich gar nicht, was das damit zu tun haben soll?

Denn - wie ich oben schrieb - lese ich die Daten ja erst aus einer externen Quelle so mit den vermurksten Emojis ein, um es deutlich zu machen, ich bekomme das Datenmaterial exakt so von Telegram vorgegeben. Wie kann ich das denn auf UTF8 umstellen?
 

Sempervivum

Erfahrenes Mitglied
Daran, dass es u. U. besser ist, die Emojis heil in die Datenbank hinein und wieder heraus zu bekommen, anstatt sie zu entfernen, hatte ich auch schon gedacht. Möglicher Weise ist die Problemursache trivial. Du schriebst:
es hilft auch nichts, wenn ich im json_decode ein JSON_UNESCAPED_UNICODE einfüge.
Die genannte Option ist jedoch für json_encode vorgesehen.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…