IPS 7 / PHP 8.2: Fragen zu utf8

In den Changelogs steh ja folgendes

Ok, kein Problem. Auf den PHP-Seiten stehen ja diverse Möglichkeiten zur Verfügung (für utf8_decode() - utf8_encode() analog)

$iso8859_1_string = mb_convert_encoding($utf8_string, 'ISO-8859-1', 'UTF-8');
$iso8859_1_string = iconv('UTF-8', 'ISO-8859-1', $utf8_string);
$iso8859_1_string = UConverter::transcode($utf8_string, 'ISO-8859-1', 'UTF8');

Dabei ist das primär genannte _ mb_convert_encoding()_ nicht ganz gleich, es bricht bei einem fehlerhaften ab, uft8_decode() nicht:

utf8_decode — Konvertiert eine Zeichenkette von UTF-8 nach ISO-8859-1 und ersetzt ungültige und nicht darstellbare Zeichen

Für ein ähnliches Verhalten stehen zur Verfügung

$iso8859_1_string = UConverter::transcode($utf8_string, 'ISO-8859-1', 'UTF-8', ['to_subst' => '?']);

bzw.

$iso8859_1_string = iconv("UTF-8", "ISO-8859-1//IGNORE", $utf8_string);

Ist möglicherweise Haarspalterei, aber so ganz halt nicht, wenn man Strings konvertiert, die nicht garantiert utf8 sind.

Nur leider steht auf den PHP-Seiten auch:

Andere Optionen, die in Abhängigkeit von den installierten Erweiterungen verfügbar sein können, sind

Gibt es eine Präferenz? Was benutzt ihr?

das habe ich leider gar nicht richtig einsortieren können, versuche das mal für mich zu übersetzen.
Ich habe ein Modul, das via. MQTT-Client kommuniziert. Hiermit kommunizieren ich so:

     $json = [
            'DataID'           => '{043EA491-0325-4ADD-8FC2-A30C8EEB4D3F}',
            'PacketType'       => 3,
            'QualityOfService' => 0,
            'Retain'           => false,
            'Topic'            => $topic,
            'Payload'          => utf8_encode($payload)
        ];
        parent::SendDataToParent(json_encode($json));

Bedeutet der o.g. Hinweis nun, ich muss statt utf8_encode() nun bin2hex() aufrufen?
Allerdings doch nur für IPS-Versionen ab 7. Sprich, wenn ich das Modul (einstweilen) noch für 6.x offen halten möchte, würde ich - abhängig von IPS_GetKernelVersion() - den leicht unterschiedlichen Code zur Kodierung von Payload verwenden würde.

Habe ich das richtig verstanden?

Danke

Ich benutze

mb_convert_encoding($string, 'ISO-8859-1')

Das ist der Vorschlag meiner Entwicklungsumgebung PHPStorm und bislang gab es noch keine Probleme damit.

Gar nichts mehr :slight_smile:
Bei mir haben sich die ganzen Probleme von IPS 4/5 mit den falschen Sonderzeichen und Co in ‚Luft‘ aufgelöst mit IPS 6.

Nein.
bin2hex gilt nur für die neue ModulKlasse IPSModuleStrict.
Solang du die nicht benutzt, sondern bei IPSModule bleibst, musst wu auch weiterhin utf8de/encode bei binären Daten nutzen.
Michael

1 „Gefällt mir“

Ich habe das jetzt in einem Modul auf Hinweis von @Nall-chan auch weggelassen und alles war gut. Einfach mal ausprobieren!

ok, dann mache ich das mal auch so

grundsätzlich ist der Hinweis sehr gut, viele utf8_decode() waren bei mir in SendDebug-Aufrufen verwendet.
Das ist hinfällig

Bleibt noch ein Problem bei mir:

wenn ich mit IPS_GetSnapshot() umgehe, mache ich (in etwa) folgendes:

$sdata = IPS_GetSnapshotChanges($TimeStamp);
$udata = utf8_encode($sdata);
$snapshot = json_decode($udata, true);

Ich kann mich nicht mehr zu 100%, bim mir aber sicher, das das json_decode() gerumst hat. Kam irgend ein Fehler, der auf UTF hindeutete ( JSON_ERROR_UTF8 oder so).
Passierte leider selten, daher weis ich nicht, ob das noch ein Thema ist.
Klingelt es da bei dir irgendwo?

ah, ok. danke

Das ist nicht mehr erforderlich. Der alte JSON Parser, den wir genutzt hatten, war nachlässig. Der neue, seit der 6.3, ist strikt und zu 100% konform.

utf8_encode/utf8_decode werden uns leider bei alten I/Os noch begleiten, bis die 7.0 veröffentlicht wird und wir auf IPSModuleStrict wechseln können. Evtl. werde ich aber passende Alternativen, sodass man nicht direkt auf IPSModuleStrict wechseln muss. Die utf8_encode/utf8_decode Umstellung hat somit an dieser Stelle definitiv Zeit und ist eher langfristiger gedacht. Trotzdem könnt ihr aber in euren Module schauen, ob ihr die Befehle sonst nutzt, wo Sie gar nicht notwendig mehr sind oder noch nie waren.

paresy

alles klar, dann kann ich die Stellen bereinigen.
Nach dem Hinweis von @Nall-chan bleiben nur noch zwei Stellen über (I/O’s), die habe ich aber auch direkt auf mb_convert_encoding umgestellt.

Da ich auf Version 7 umgestellt habe und zigbee2tasmota nutze bekomme ich eine Menge Fehlermeldungen
Kann Daten nicht zur Instanz xxxx weiterleiten:
vom …ips.zigbee2tasmota/connect/module.php in line 47
Depreciated: Function utf8_decode()
Das Modul ist über den Store installiert. Version 1.2.5

Ich vermute dass deine php.ini nicht korrekt angepasst werden kann wegen dem hier.

paresy

Stimmt :slight_smile: und vielen Dank