Ankündigung

Einklappen
Keine Ankündigung bisher.

Zeichencodierung Umlaute beim Zurücklesen eines sockets

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [HS-Logik] Zeichencodierung Umlaute beim Zurücklesen eines sockets

    Hallo an euch,

    ich arbeite an einer Ansteuerung eines Denon Heos Amps mithilfe des Homeservers. Auf Basis des Bausteines von Grot Gebäudeautomation setze ich eine selbst entwickelte HS Logik für die Mediensteuerung ein. Ich setze den Experten 4.9 und einen Homeserver i22 ein.

    Dafür generiere ich JSON commands. Diese sende und empfange ich erfolgreich mittels sockets

    Vereinfacht:
    Code:
    # create socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # connect
    s.connect((ip, port))
    # send command
    s.send(command.encode('ASCII') + b'\r\n')
    # receive data
    data = s.recv(BufferSize)
    Wenn ich jetzt allerdings z.B. Radiosender mit Umlauten auslesen möchte, dann werden diese nicht korrekt am iPhone / QuadClient angezeigt. Auf dem Android Tablet allerdings schon.
    Es würde mich auch schon reichen die Umlaute zu ersetzen. zb 'ö' durch 'oe'.

    Anzeige am Quad Client (Anmerkung: Das R bei KxxxRnten ist in Großbuchstaben, weil ich die string.title() Funktion nach der Textaufbereitung verwende - das sollte bei korrekter Darstellung eines 'ä' nicht mehr auftreten):

    texte fehlanzeige.JPG

    Ich habe nun schon verschiedenste Varianten zur Codierung/Dekodierung (ASCII, UTF-8, UTF16, UTF32, ISO???) oder auch Ersetzung erfolglos ausprobiert. Einiges wurde problemlos im Simulator/HS ausgeführt - einiges nicht - obwohl es in einer Python Umgebung lief.


    In der Testumgebung des SDKs funktionieren manche Varianten - am realen HS/Quadclient/iPhone nicht.

    texte ersetzen.JPG

    Code:
    radio_station_name = radio_station_name.replace('\xe2\x94\x9c\xc3\xa4', 'Ae')
    radio_station_name = radio_station_name.replace('\xe2\x94\x9c\xc3\xbb', 'Oe')
    radio_station_name = radio_station_name.replace('\xe2\x94\x9c\xc2\xa3', 'Ue')
    radio_station_name = radio_station_name.replace('\xe2\x94\x9c\xc3\xb1', 'ae')
    radio_station_name = radio_station_name.replace('\xe2\x94\x9c\xc3\x82', 'oe')
    radio_station_name = radio_station_name.replace('\xe2\x94\x9c\xe2\x95\x9d', 'ue')
    radio_station_name = radio_station_name.replace('\xe2\x94\x9c\xc6\x92', 'ss')
    Hinsichtlich des Ersetzens habe ich, neben der stupiden Ersetzung durch Umlaute und Sonderzeichen laut Konsolenausgabe, schon folgende Varianten probiert:

    Code:
    #V1
    #ä    \xc3\x83\xc2\xa4
    #ö    \xc3\x83\xc2\xb6
    #ü    \xc3\x83\xc2\xbc
    
    #Ü    \xc3\x83\xc5\x93/
    #Ö    \xc3\x83\xe2\x80\x93
    #ß    \xc3\x83\xc5\xb8/
    
    #V2
    #ä    \xc3\xa4
    #ö    \xc3\xb6
    #ü    \xc3\xbc
    #Ä    \xc3\x84
    #Ö    \xc3\x96
    #Ü    \xc3\x9c
    #ß    \xc3\x9f
    
    #V3
    #Ä    \xe2\x94\x9c\xc3\xa4
    #Ö    \xe2\x94\x9c\xc3\xbb
    #Ü    \xe2\x94\x9c\xc2\xa3
    #ä    \xe2\x94\x9c\xc3\xb1
    #ö    \xe2\x94\x9c\xc3\x82
    #ü    \xe2\x94\x9c\xe2\x95\x9d
    #ß    \xe2\x94\x9c\xc6\x92
    Auch mit der Urllib(2) habe ich bereits "unquote" ausprobiert.

    Ebenfalls habe ich bereits versucht mit dem Homeserver Projektoptionen z.B. das ASCII Zeichen 0xC3 bei eingehenden HTTP Telegrammen, welches anscheinend bei einem 'ä' angezeigt wird zu entfernen. Ohne Erfolg.

    Am liebsten wäre mir natürlich eine Lösung in Python.
    Vielleicht hat ja von euch einer eine Idee

    Schöne Grüße und Vielen Dank im Voraus
    Gerald
    Zuletzt geändert von Bollwing; 27.11.2019, 02:32.

    #2
    Hallo,

    ich habe bei dem Thema mich nicht locker gelassen. Allerdings habe ich es nach wie vor nicht hinbekommen die Sonderzeichen zu ersetzen. Auch das Suchen nach ASCII Zeichen/Codierungen brachte nichts. man müsste halt irgendwie hinein debuggen können und die realen Werte/Repräsentationen der Zeichen ausfindig machen zu können.

    Ich habe jetzt als Workaround einen Regular Expression Parser gebaut, welcher eine Liste von Ersetzungen als Input erhält. Damit habe ich vorerst das gewünschte Ergebnis erreicht. Das hat leider den Nachteil, dass man später, bei Änderung der Favoriten oder Umbenennung der Quellen, weitere Worte einpflegen muss.

    lg
    Gerald

    Kommentar


      #3
      Habe ein ähnliches Thema, bei dem String als Unicode String ausgegebene werden, z.B. u'Text'.

      Ich meine mich zu erinnern, dass Pythin mit UTF-8 läuft, die Logik-Engine jedoch mit ISOxxx. Leider finde ich diese Referenz nicht mehr, ich vermute, es war irgendein Post hier im Forum. Mit der Info, welche Codierung die Logic-Engine nutzt, müsste dann doch mit str.encode("ISOxxx") und anschließender Ersetzungstabelle das Problem gelöst werden können, oder? Aber das hast du schon versucht?

      Kommentar


        #4
        Für solche Fälle gibt es seit 15 Jahren einen LBS http://service.knx-user-forum.de/?co...nload&id=19872
        Mfg Micha
        Ich sage ja nicht, das wir alle dummen Menschen loswerden müssen, aber könnten wir nicht einfach alle Warnhinweise entfernen und den Dingen ihren Lauf lassen?

        Kommentar


          #5
          Zumindes bei Unicode Strings ist das Problem, dass eine exception geworfen wird, wenn Umlaute nicht dargestellt werden können, was die Verarbeitung des Bausteins beendet.

          Aber: Wird ein String mit .encode('ascii', 'xmlcharrefreplace') enkodiert, werden die Umlaute in einer freien Visu korrekt dargestellt. Habe aber keine Ahnung, ob das die Logik, die Visu-Engine oder der Browser macht. Auch weiß ich nicht, ob’s für den QC geht.

          Kommentar

          Lädt...
          X