[gelöst] expandJSON: Unicode-Zeichen für ß (\u00df) nicht korrekt verarbeitet

Begonnen von binford6000, 27 August 2022, 12:11:25

Vorheriges Thema - Nächstes Thema

rudolfkoenig

Meine Email Adresse zu finden duerfte nicht zu schwer sein, notfalls siehe Impressum.

Dr. Boris Neubert

@Rudi: hast Du, was Du brauchst? Sonst sende ich Dir meinen Output von bimmerconnected per PM.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

binford6000

Zitat von: Dr. Boris Neubert am 02 September 2022, 09:15:41
@Rudi: hast Du, was Du brauchst? Sonst sende ich Dir meinen Output von bimmerconnected per PM.

Ich hab heute morgen eine Mail verschickt mit einem Link zu meinen Daten.
Sollte also da sein  ;)

Dr. Boris Neubert

Noch ein anderer Gedanke:

JSON muss UTF-8-Kodierung benutzen.
bimmerconnected schickt freundlicherweise \u00df für das ß. Das ist der Unicode-Codepoint für ß. Es spielt also keine Rolle, dass die UTF-8-Kodierung des ß zwei Byte umfasst oder wie sie überhaupt aussieht.

Im FHEM-Log steht das Byte 0xdf. Das wäre latin1 IMHO.

Und weiter weiß ich nicht, weil ich nicht weiß, in welcher Kodierung FHEM Zeichenketten standardmäßig verarbeitet und in welcher Kodierung FHEMWEB die Webseiten ausliefert und an welcher Stelle in diesem Zusammenspiel die Inkonsistenz sitzt.


Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

rudolfkoenig

Zitatbimmerconnected schickt freundlicherweise \u00df für das ß. Das ist der Unicode-Codepoint für ß.
Falls man "attr global encoding unicode" setzt (die Voreinstellung ist bytestream, aka UTF-8), dann gibt es auch keine Dastellungsprobleme.
Ich habe json2nameValue in fhem.pl jetzt angepasst, so das auch in der Voreinstellung ß angezeigt wird.

ZitatDas wird bei 233 Readings aber mühselig  :o
Mit einem brauchbaren Editor ein paar Sekunden.
Mit etwas extra Muehe kann man sinnlose Readings entfernen, und die anderen besser benennen.
Und wenn man das Ergebnis spendiert, dann kann man das in einem attrTemplate verewigen, so dass auch Andere was davon haben.

Alternativ kann man das 1_ auch mit dem folgenden Einzeiler entfernen:
attr MQTT2_bmw readingList bmw:bmw:.* { my $h1 = json2nameValue($EVENT);; my %h2 = map { my $k=$_;; $k=~s/^1_//;; ($k,$h1->{$_}) } keys %{$h1};; \%h2 }

Dr. Boris Neubert

Zitat von: rudolfkoenig am 02 September 2022, 12:28:03
Falls man "attr global encoding unicode" setzt (die Voreinstellung ist bytestream, aka UTF-8), dann gibt es auch keine Dastellungsprobleme.
Meinem Verständnis nach bezeichnet Unicode, welche Zahl für welches Zeichen steht, also 223 für ß. Es gibt dann unterschiedliche Kodierungen (UTF-8, UTF-16LE, UTF-16BE, UTF-32, UCS-2, ...), wie diese Zahl in einem oder mehreren Bytes auf dem Rechner dargestellt wird. Meinem Verständnis nach genügt es nicht zu sagen, dass ein String Unicode sei. In Windows sind Unicode-Strings standardmäßig UTF-16.

Ich verstehe, dass die Voreinstellung bei FHEM (wohl bei Perl) UTF-8 ist. Welche Kodierung wird verwendet bei attr global encoding unicode?

Zitat
Ich habe json2nameValue in fhem.pl jetzt angepasst, so das auch in der Voreinstellung ß angezeigt wird.

Danke. Ich lasse morgen das Update durchlaufen und sehe mir das Ergebnis an.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

rudolfkoenig

ZitatIch verstehe, dass die Voreinstellung bei FHEM (wohl bei Perl) UTF-8 ist. Welche Kodierung wird verwendet bei attr global encoding unicode?
In der Voreinstellung konvertiert FHEM nichts bei der Ein-/Ausgabe und hofft darauf, dass die ganze Welt fuer Datenaustausch UTF-8 verwendet, was fuer Daten in FHEM-Umfeld zu 98% stimmt. Alles was davon abweicht, muss fuer die interne Speicherung nach UTF-8 konvertiert werden.

Mit "attr global unicode" muessen alle (Framework und Module) darauf achten, dass die Daten bei der Eingabe von UTF-8 in das perl eigene Format (UTF32? habs nicht rausgekriegt) konvertiert werden, und bei der Ausgabe andersherum. Das Problem mit dieser Methode ist, dass alle Module, die Daten mit der Umwelt austauschen, explizit was machen muessen.
Konkret muss man entweder Encode::encode bzw. Encode::decode aufrufen, oder beim Filehandle binmode($fh, ":encoding(UTF-8)") setzen.

binford6000

ZitatIch habe json2nameValue in fhem.pl jetzt angepasst, so das auch in der Voreinstellung ß angezeigt wird.

Passt! Vielen Dank Rudolf!

ZitatMit etwas extra Muehe kann man sinnlose Readings entfernen, und die anderen besser benennen.
Und wenn man das Ergebnis spendiert, dann kann man das in einem attrTemplate verewigen, so dass auch Andere was davon haben.

Das ist eine ausgezeichnete Idee -  wenn ich mal wieder etwas mehr Freizeit habe!  :)

VG Sebastian

Dr. Boris Neubert

Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Dr. Boris Neubert

Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!