FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Pi_01 am 25 April 2020, 16:49:28

Titel: Umlaute werden falsch dargestellt
Beitrag von: Pi_01 am 25 April 2020, 16:49:28
Hallo,
ich habe in einem Device anscheinend ein Zeichensatzproblem, denn die Umlaute werden falsch dargestellt.

Testweise habe ich das Attribut

get01Encode utf8

gelöscht, doch das Problem wird nicht gelöst.

Kann es damit zu tun haben, dass der Code in PERL (Stichwort 99_myUtils.pm) weiterverarbeitet wurde?
Titel: Antw:Umlaute werden falsch dargestellt
Beitrag von: amenomade am 25 April 2020, 18:30:13
Wie "falsch" dargestellt?
Anscheinend handelt es sich um ein HTTPMOD. Kann man ein "list" davon sehen (ggf Login Daten entfernen)
Und ja, was Du im Code in myUtils machst, kann damit etwas zu tun haben. Den Code kennen wir aber nicht...

EDIT: handelt es sich um den hier https://forum.fhem.de/index.php/topic,110394.msg1045632.html#msg1045632 ? Da hatte bei mir get01Encode utf8 das Problem gelöst.
Titel: Antw:Umlaute werden falsch dargestellt
Beitrag von: Pi_01 am 25 April 2020, 19:34:23
Zitat von: amenomade am 25 April 2020, 18:30:13
Wie "falsch" dargestellt?
Anstatt ein "ü" wird z.B. "\u00" ausgegeben.

Wenn ich "attr meinDevice showBody 1" ausführe, dann sehe ich, dass bereits im httpbody die Umlaute falsch dargestellt werden.

Zitat von: amenomade am 25 April 2020, 18:30:13
EDIT: handelt es sich um den hier https://forum.fhem.de/index.php/topic,110394.msg1045632.html#msg1045632 ? Da hatte bei mir get01Encode utf8 das Problem gelöst.
Ja, dass ist der Code.
Und ja, "attr meinDevice get01Encode utf8" behob einst das Problem mit den Umlauten.
Daher verstehe ich nicht, was nun dazu führt das die Umlaute plötzlich falsch ausgegeben werden.

Anbei der vollständige Code:

defmod meinDevice HTTPMOD https://bskv.sportwinner.de/php/bskv/service.php 0
attr meinDevice userattr get01Data get01Encode get01Name getHeader01 getHeader02 getHeader03 getHeader04 reading01Name reading01Regex
attr meinDevice enableControlSet 1
attr meinDevice extractAllJSON 1
attr meinDevice get01Data command=GetSpiel&id_mandant=1&id_saison=5&id_klub=0&id_land=1&id_bezirk=4&id_kreis=7&id_liga=1638&id_spieltag=0&favorit=&art_bezirk=1&art_kreis=1&art_liga=0&art_spieltag=0
attr meinDevice get01Encode utf8
attr meinDevice get01Name MBayernNord_Spiel
attr meinDevice getHeader01 Accept: application/json, text/javascript, */*;; q=0.01
attr meinDevice getHeader02 Origin: https://bskv.sportwinner.de
attr meinDevice getHeader03 Referer: https://bskv.sportwinner.de/
attr meinDevice getHeader04 User-Agent: Mozilla/5.0
attr meinDevice room Kegeln
attr meinDevice showBody 1
attr meinDevice stateFormat {return &meineFunktion('Inhalt2')}



Nachtrag: im httpbody sind die Umlaute falsch, in den Readings richtig.
Ich verwende die Readings aber nicht, weil ich den httpbody in der eigenen PERL-Funktion mit "my $var1 = InternalVal("meinDevice","httpbody", "");" weiterverarbeite.
Titel: Antw:Umlaute werden falsch dargestellt
Beitrag von: amenomade am 25 April 2020, 21:24:32
Es funktioniert so:
- die Seite wird gelesen, das "raw" Ergebnis wird in buffer / body Internal gespeichert
- die Readings werden anhand Regex/JSON aus dem Body extrahiert und dann anhand get01Encode oder get01OExpr nachformattiert.

Wenn Du mit dem Body spielst, hast Du noch die "rohe" Daten. Du musst selbst die UTF8 Umformattierung machen.
use Encode qw(encode);

$result = encode ('utf8', "\u00Dingsbums");
Titel: Antw:Umlaute werden falsch dargestellt
Beitrag von: Pi_01 am 25 April 2020, 21:54:59
Zitat von: amenomade am 25 April 2020, 21:24:32
Es funktioniert so:
- die Seite wird gelesen, das "raw" Ergebnis wird in buffer / body Internal gespeichert
- die Readings werden anhand Regex/JSON aus dem Body extrahiert und dann anhand get01Encode oder get01OExpr nachformattiert.

Wenn Du mit dem Body spielst, hast Du noch die "rohe" Daten. Du musst selbst die UTF8 Umformattierung machen.
use Encode qw(encode);

$result = encode ('utf8', "\u00Dingsbums");


Die "ü" werden trotzdem immer noch als "\\u00fc" dargestellt ....  :(
Titel: Antw:Umlaute werden falsch dargestellt
Beitrag von: amenomade am 25 April 2020, 23:22:15
Wahrscheinlich weil dann die \u00xx schon als String und nicht mehr als Unicode Character interpretiert sind.
Da weiss ich nicht, wie man es machen kann.

EDIT: habs doch geschafft, siehe unten ;)
Titel: Antw:Umlaute werden falsch dargestellt
Beitrag von: amenomade am 26 April 2020, 00:56:44
use Encode qw(encode);
my $string = '[["235812","20.03.2020","20:30","Blau Wei\u00df Mauern [47,"F\u00f6rtsch, J\u00f6rg","Lohengrin Kulmbach","M\u00e4nner","8","6","14","532,5"';
$string =~ s/\\u(\w{4})/encode("utf8",chr(hex($1)))/ge;
printf $string;

ergibt
[["235812","20.03.2020","20:30","Blau Weiß Mauern [47,"Förtsch, Jörg","Lohengrin Kulmbach","Männer","8","6","14","532,5"
Titel: Antw:Umlaute werden falsch dargestellt
Beitrag von: Pi_01 am 26 April 2020, 08:15:14
Tatsächlich, du hast das Problem wieder einmal gelöst. Respekt!

Aber ist dieser Lösungsansatz im Sinne des Erfinders? Ich dachte FHEM könne mit Zeichensätzen elegant umgehen.

Diesen regulären Ausdrück hätte ich selbst auf jeden Fall niemals hinbekommen.
Titel: Antw:Umlaute werden falsch dargestellt
Beitrag von: amenomade am 26 April 2020, 12:10:45
Zitat von: Pi_01 am 26 April 2020, 08:15:14
Tatsächlich, du hast das Problem wieder einmal gelöst. Respekt!

Aber ist dieser Lösungsansatz im Sinne des Erfinders? Ich dachte FHEM könne mit Zeichensätzen elegant umgehen.

Diesen regulären Ausdrück hätte ich selbst auf jeden Fall niemals hinbekommen.

Naja... das ist ein Sonderfall. Wenn Du mit Internals arbeitest, musst Du davon ausgehen, dass nicht alles automatisch funktioniert. Internals sind ja ... Internals ... also grundsätzlich "versteckte" Sachen
Titel: Antw:Umlaute werden falsch dargestellt
Beitrag von: frank am 26 April 2020, 12:22:22
warum nutzt du überhaupt den buffer und überlässt das parsen nicht dem modul?

du könntest auch den ganzen buffer in ein reading parsen lassen. dann sollten wenigstens die zeichen passen.
Titel: Antw:Umlaute werden falsch dargestellt
Beitrag von: Pi_01 am 26 April 2020, 23:50:42
Zitat von: frank am 26 April 2020, 12:22:22
du könntest auch den ganzen buffer in ein reading parsen lassen.
Und wie?
Titel: Antw:Umlaute werden falsch dargestellt
Beitrag von: amenomade am 26 April 2020, 23:55:57
get01Regex (.*)

Dies habe ich aber erfolglos getestet: ein get01Regex (.*) nimmt zwar das ganze in einem Reading, aber er kann dann mit get01Encode nicht mehr die \u0000 Werte decodieren, vermutlich weil die Wörter, die diese Zeichen enthalten, zwischen quotes sind (JSON Format).

Anders ist es, wenn man ein einziges Wort/JSON-Feld mit getXXJSON oder extractAllJSON extrahiert. Da funktioniert get01Encode
Titel: Antw:Umlaute werden falsch dargestellt
Beitrag von: frank am 27 April 2020, 10:29:00
das arsenal ist unerschöpflich.  :)
ich habe noch folgende attribute gefunden:

bodyDecode
regexDecode
preProcessRegex

es fehlt noch die antwort auf:
Zitatwarum nutzt du überhaupt den buffer und überlässt das parsen nicht dem modul?

für profis gibt es auch noch:

parseFunction1
parseFunction2
Titel: Antw:Umlaute werden falsch dargestellt
Beitrag von: amenomade am 27 April 2020, 12:49:06
bodyDecode geht auch nicht

preProcessRegex funktioniert zumindest mit der obigen Regex nicht.

parseFunction1 wird meiner Meinung nach in dem Fall ein bisschen schwierig einzusetzen.

Da ich immer noch nicht genau weiss, welche Daten der TE braucht, kann ich die Frage nicht beantworten. Meine Vermutung: die JSON Struktur mit "Tabellen" ist ein bisschen zu schwierig automatisch zu parsen.
Titel: Antw:Umlaute werden falsch dargestellt
Beitrag von: Pi_01 am 27 April 2020, 16:52:40
Zitat von: amenomade am 27 April 2020, 12:49:06
Meine Vermutung: die JSON Struktur mit "Tabellen" ist ein bisschen zu schwierig automatisch zu parsen.
Korrekt!
Titel: Antw:Umlaute werden falsch dargestellt
Beitrag von: herrmannj am 27 April 2020, 19:05:54
Wenn es um JSON geht ist evtl JsonMod besser geeignet
Titel: Antw:Umlaute werden falsch dargestellt
Beitrag von: amenomade am 27 April 2020, 19:29:31
Kann JsonMod auch HTTP Headers setzen?
EDIT: ich antworte selbst: Obwohl nicht dokumentiert, kann man anscheinend doch Headers setzen.
Allerdings schaffe ich das gleiche wie HTTPMOD gar nicht. Wahrscheinlich weil JsonMod nur GET Requests macht. Die Webseite hier macht POST
Titel: Antw:Umlaute werden falsch dargestellt
Beitrag von: herrmannj am 27 April 2020, 19:38:52
Genau