Das ewige Problem mit Umlauten/Sonderzeichen

Hi!

Seit ich mit IPS arbeite (sind schon ein paar Jahre), ärgere ich mich mit dem Thema Umlaute/Sonderzeichen rum. Jetzt war es mal wieder soweit. Seit über 3 Stunden versuche ich das Problem in den Griff zu bekommen - keine Chance… :banghead:

Alle Dateien vom Modul sind mit UTF-8 Kodierung gespeichert und das Test-System hat als Locale „de_DE.UTF-8“.

In der Instanz eines Moduls ist ein Textfeld, dort trage ich z.B. ein (landet dann später in $notificationText):

„Der Host -§HOST- mit Adresse -§ADRESSE- ist seit §ZEITMIN Minuten nicht mehr erreichbar“

Im Debug kommen die verschiedensten Ausgaben (aber niemals alle „Variablen“ korrekt ersetzt), je nachdem was ich von diesen Versuchen aktiviere (auch in verschiedenen Kombinationen):

$notificationText = mb_convert_encoding($notificationText, "UTF-8", "auto");
//$notificationText = utf8_encode($notificationText);
//$notificationText = utf8_decode($notificationText);
//$notificationText = str_replace(chr(195), '', $notificationText);
//$notificationText = str_replace(chr(194), '', $notificationText);

Mein Modul macht z.B. folgendes:

$search = array('§HOST', '§ADRESSE', '§ZEITSEK', '§ZEITMIN', '§ZEITSTD', '§ZEITTAGE');
$this->SendDebug('TEST-111', json_encode($search), 0);
$replace = array($hostName, $hostAddress, $lastOnlineTimeDiffSEC, $lastOnlineTimeDiffMIN, $lastOnlineTimeDiffHOURS, $lastOnlineTimeDiffDAYS);
$Text = str_replace($search, $replace, $notificationText);
$this->SendDebug('TEST-222', json_encode($search), 0);

Die Ausgaben im Debug (egal ob Legacy- oder Web-Console) sieht dann z.B. wie folgt aus:

Test-111 = ["\u00a7HOST","\u00a7ADRESSE","\u00a7ZEITSEK","\u00a7ZEITMIN","\u00a7ZEITSTD","\u00a7ZEITTAGE"]
Test-222 = ["\u00a7HOST","\u00a7ADRESSE","\u00a7ZEITSEK","\u00a7ZEITMIN","\u00a7ZEITSTD","\u00a7ZEITTAGE"]
Text = Der Host -192.168.10.11- mit Adresse -§ADRESSE- ist seit §ZEITMIN Minuten nicht mehr erreichbar

Das ist die best mögliche Variante die ich hin bekomme - aber warum wird nur die erste „Variable“ korrekt ersetzt und bei den beiden anderen tauchen auf einmal komische Zeichen auf, obwohl eine Zeile davor das Json alle „Variablen“ identisch anzeigt??? :confused: :banghead:

Mache ich das ganze im gleichen IPS in einem Skript, dann ist alles normal:

<?php

$test = "YYY";
$hostName = "ServerXY";
$hostAddress = "192.168.1.1";
$lastOnlineTimeDiffSEC = 60;
$lastOnlineTimeDiffMIN = 1;
$lastOnlineTimeDiffHOURS = 0;
$lastOnlineTimeDiffDAYS = 0;
$notificationText = "TEST: §XXX // Der Host -§HOST- mit Adresse -§ADRESSE- ist seit §ZEITMIN Minuten nicht mehr erreichbar";

var_dump(json_encode($notificationText));

$search = array('§XXX', '§HOST', '§ADRESSE', '§ZEITSEK', '§ZEITMIN', '§ZEITSTD', '§ZEITTAGE');
$replace = array($test, $hostName, $hostAddress, $lastOnlineTimeDiffSEC, $lastOnlineTimeDiffMIN, $lastOnlineTimeDiffHOURS, $lastOnlineTimeDiffDAYS);
$text = str_replace($search, $replace, $notificationText);

var_dump($text);

Die Ausgabe ist wie zu erwarten:

string(125) „„TEST: \u00a7XXX // Der Host -\u00a7HOST- mit Adresse -\u00a7ADRESSE- ist seit \u00a7ZEITMIN Minuten nicht mehr erreichbar““
string(99) „TEST: YYY // Der Host -ServerXY- mit Adresse -192.168.1.1- ist seit 1 Minuten nicht mehr erreichbar“

Ich weiß nicht mehr weiter…mehr als eine „Variable“ bekomme ich im Modul nicht ersetzt…
Damit die User nichts am Modul ändern müssen beim Update, muss ich auch beim „§“ als „Erkennungszeichen“ bleiben.
Bin für jeden Tipp dankbar!

Viele Grüße,
Chris

Es ist zwar nicht DIE Lösung…aber es funktioniert :smiley:
Mit „preg_replace“, statt „str_replace“, funktioniert das „übersetzen“ der „Variablen“ :confused:
Mache ich mit dem gleichen String noch ein zweites Mal ein „preg_replace“, dann ist die Ausgabe allerdings wieder kaputt. Brauche ich nicht, von daher ist es für diesen Fall „ok“.

Bleibt nur noch die Frage, warum Debug-Text mit Umlauten weiterhin kaputt ausgegeben wird…
Das hier in der module.php (egal, ob mit oder ohne Translate):

$this->SendDebug('Test', 'Benachrichtigung für Host-Online wurde ausgelöst', 0);

Erzeugt diese Debug-Ausgabe:

Benachrichtigung für Host-Online wurde ausgelöst

Ich hatte früher schon verschiedene Versuche gemacht bzgl. IPS und Umlauten/Sonderzeichen…und immer wieder bin ich über IPS-Funktionen gestolpert die wohl „intern“ irgendwas vermurksen bzgl. UTF-8 und so die Umlaute/Sonderzeichen kaputt machen :frowning:

Grüße,
Chris

Sehr seltsam. Ein Versuch mit

        $notificationText = "Der Host -§HOST- mit Adresse -§ADRESSE- ist seit §ZEITMIN Minuten nicht mehr erreichbar";
        $search = array('§HOST', '§ADRESSE', '§ZEITSEK', '§ZEITMIN', '§ZEITSTD', '§ZEITTAGE');
        $this->SendDebug('TEST-111', json_encode($search), 0);
        $replace = array('Hostname', 'Hostadresse', 'lastOnlineTimeDiffSEC', 'lastOnlineTimeDiffMIN', 'lastOnlineTimeDiffHOURS', 'lastOnlineTimeDiffDAYS');
        $Text = str_replace($search, $replace, $notificationText);
        $this->SendDebug('TEST-222', json_encode($Text), 0);

ergibt bei mir im Debug:

TXT: 31.12.2019, 15:37:48 |             TEST-111 | ["\u00a7HOST","\u00a7ADRESSE","\u00a7ZEITSEK","\u00a7ZEITMIN","\u00a7ZEITSTD","\u00a7ZEITTAGE"]
TXT: 31.12.2019, 15:37:48 |             TEST-222 | "Der Host -Hostname- mit Adresse -Hostadresse- ist seit lastOnlineTimeDiffMIN Minuten nicht mehr erreichbar"

Sind wirklich bei dir im Modul alle Dateien auf UTF-8?

Ich wünsche dir einen guten Rutsch!

Burkhard

Hi Burkhard!

Laut PhpStorm und Notepad++ sind alle Dateien in UTF-8 kodiert :confused:

Ich werde mal mit neuen Dateien experimentieren - vlt ist irgendwo irgendwas durcheinander…

Dir auch einen guten Rutsch in ein gesundes und glückliches neues Jahr!

Danke und viele Grüße,
Chris

Auch neue Dateien ändern leider nichts an den zerschossenen Umlauten :confused:

-Chris-

Ich bin kurz vor dem Release einer neuen Version vom Tankerkönig-Modul … und dabei ist mir noch etwas interessantes bzgl. der Umlaute-Problematik aufgefallen…

Mit „$this->LogMessage“ kommt im Meldungen-Fenster die Meldung korrekt mit Umlauten:

Die Abfrage der Tankstellenliste lieferte keine gültigen Daten // Radius zu klein? // Keine Tankstelle im Radius geöffnet?

Die identische Meldung über „$this->SendDebug“ sieht im Debug-Fenster wie folgt aus:

Die Abfrage der Tankstellenliste lieferte keine gültigen Daten // Radius zu klein? // Keine Tankstelle im Radius geöffnet?

In der Web-Console wird die Meldung aber in !beiden! Fenstern mit korrekten Umlauten ausgegeben! Es betrifft also (in diesem Fall) nur die Legacy-Console!
Letztens hatte ich ja bei einem anderen Modul in der Web-Console auch zerschossene Umlaute, das ist aber bei diesem Modul nicht der Fall!

Und, falls relevant, die Meldungen stehen in der module.php in Englisch und werden über „$this->Translate“ ins Deutsche übersetzt.

Von der IPS-Console verwende ich die neuste Version. In den Dateiinformationen steht leider nur 5.3.0.0. Ist die Legacy-Console aus dem Ninja-Kanal. IPS läuft auf einem Ubuntu Server 18 LTS.

@paresy: Vlt. hilft dir das weiter und du kannst es nachstellen und beheben?

Danke und Grüße,
Chris

Da der Fehler extrem selten ist und der Aufwand ihn zu beheben eher groß, werde ich ihn vermutlich nicht mehr in der Legacy Konsole beheben.

paresy

Ok, wenn ich das weiß, dann kein Problem - biege ich halt die Umlaute weiter um :slight_smile:

Aber nachstellen kannst du das Problem?

Danke und Grüße,
Chris