Ergebnis 1 bis 4 von 4
  1. #1
    Avatar von Mr.Servo
    Registriert seit
    10.08.2020
    Ort
    Pfalz / Palatinate
    Beiträge
    2.615
    Thanks (gegeben)
    1794
    Thanks (bekommen)
    2415
    Total Downloaded
    56,91 MB
    Total Downloaded
    56,91 MB
    ReceiverDanke
    Box 1:
    GigaBlue UHD UE 4k Cable (openATV 7.4)
     
     
    Box 2:
    Mut@nt HD51 4k Cable (oATV DEVEL)
     
     

    Lightbulb Umlaute in STRINGS von externen Quellen

    Hallo Zusammen,

    ein Thema was bei Programmierungen rund um openATV & ENIGMA2 wohl gar nicht auftaucht, ist das Handling von verkorksten Umlauten. Innerhalb der E2-Welt herrscht relative Harmonie.

    Ganz anders aber, wenn Plugins auf externe Quellen zugreifen oder "exotische" Funktionen nutzen müssen, die nicht so ganz astreine Rückergebnisse liefern. Es ist schon schwer genug diese "Vögel" wieder einzufangen, aber das dann noch gleichsam für Python2 und Python3...

    Hier mal ein paar Beispiele, die mir schon über den Weg gelaufen sind:

    Es geht um STRINGs wie diese (Mixup von UTF-8 und Unicode): 'Z\xc3\xa4hlt nicht in K\xc3\xb6ln, nur bei H \u0026 M.'

    Die Krönung:
    "Der Wolf im Schafspelz", also ein STRING, der optisch aussieht wie ein BYTESTRING: "b'Z\xc3\xa4hlt nicht in K\xc3\xb6ln, nur bei H \u0026 M.'" aber kein BYTESTRING ist!

    Die Lösung mit einem Rattenschwanz (der Python2-Teil kann hierbei leicht erkannt & ggf. entfernt werden):
    Code:
    # -*- coding: utf-8 -*-
    from six import PY3
    
    def UnescapeUNI(text):
    	return (text.encode('latin-1').decode('utf-8') if PY3 else text.decode('unicode_escape').encode('latin-1')).replace("b'", "", 1).rstrip('\'')
    
    text = 'Z\xc3\xa4hlt nicht in K\xc3\xb6ln, nur bei H \u0026 M.'
    print(UnescapeUNI(text))
    text = "b'Z\xc3\xa4hlt nicht in K\xc3\xb6ln, nur bei H \u0026 M.'"
    print(UnescapeUNI(text))

    Und dann gehts noch um STRINGs wie diese (inkorrekt gecodetes UTF-8): 'Nachtisch & Süssspeisen' und "b'Nachtisch & Süssspeisen'"

    Die Lösung mit einem Rattenschwanz (der Python2-Teil kann hierbei leicht erkannt & ggf. entfernt werden):
    Code:
    # -*- coding: utf-8 -*-
    from six import PY3
    
    def UnescapeUTF(text):
        return (text.encode('latin-1').decode('utf-8') if PY3 else text.decode('utf-8').encode('latin-1')).replace("b'", "", 1).rstrip('\'')
    
    text = 'Nachtisch & Süssspeisen'
    print(UnescapeUTF(text))
    text = "b'Nachtisch & Süssspeisen'"
    print(UnescapeUTF(text))
    Wer glaubt das wäre locker-flockig hingezaubert, der versuche mal das Ganze etwas knapper / kürzer / effizienter hinzubiegen oder gar beide Lösungen in einer zu integrieren. Aber immer bitte lauffähig unter Python 2 +3. Wenn es eine schlauerer / schlankere Lösung gibt, nur her damit!

    Wird vielleicht dem Einen oder anderen mal helfen und Zeit sparen, wenn er diesen Artikel auf seiner Suche findet...

    Gruß.....Mr.Servo
    Geändert von Mr.Servo (07.03.2022 um 18:35 Uhr) Grund: auf .replace("b'", "", 1).rstrip('\'') verbessert

  2. Thanks örlgrey bedankten sich
    •   Alt Advertising

       

  3. #2
    geeeee
    Gast
    Hi Mr.Servo

    ich bin mit Python wenig vertraut, aber ich habe l/rstrip kennengelernt.
    Wenn man ".replace("b'", "").replace("'", "")" durch ".replace("b'", "").rstrip('\'')" ersetzen würde, ware vielleicht besser!?

    Zur Krönung: Bei Python3 gibt es eine Sache mit "bytestring", ist das deswegen vielleicht ein PY3 spezifisches Problem?

    Gruß geeeee
    Geändert von geeeee (07.03.2022 um 11:58 Uhr)

  4. Thanks Mr.Servo bedankten sich
  5. #3
    Avatar von Mr.Servo
    Registriert seit
    10.08.2020
    Ort
    Pfalz / Palatinate
    Beiträge
    2.615
    Thanks (gegeben)
    1794
    Thanks (bekommen)
    2415
    Themenstarter
    Total Downloaded
    56,91 MB
    Total Downloaded
    56,91 MB
    ReceiverDanke
    Box 1:
    GigaBlue UHD UE 4k Cable (openATV 7.4)
     
     
    Box 2:
    Mut@nt HD51 4k Cable (oATV DEVEL)
     
     
    Hi geeeee,

    hast Recht, daran hatte ich noch gar nicht gedacht. Habe es oben gleich mal verbessert! Danke Dir dafür!!!

    Aufgrund Deiner netten Anregung habe ich als Steigerung folgendes eingebaut: .replace("b'", "", 1).rstrip('\'')

    Somit rasiert er die Zeichenfolge "b'" genau nur einmal, der folgende String wird dann bezüglich "b'" nicht mehr verändert.

    Der Bytestring ist hier nicht das Thema, denn es war kein Bytestring (z.B. b'Hallo') sondern ein normaler String "b'Hallo'", der einfach nur so aussah. Kleiner aber feiner Unterschied...

    Gruß.....Mr.Servo

  6. #4
    geeeee
    Gast
    Schön. Gerne.
    Also wenn du dir sicher bist, dass das (z.B. b'Hallo') auch unter PY2 vorkommt, möchte ich hier kein Fass auf machen OK?
    Aber neu in Version 3.9 .removeprefix('\'b').
    Geändert von geeeee (08.03.2022 um 13:05 Uhr)


Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:04 Uhr.
Powered by vBulletin® Version 4.2.5 (Deutsch)
Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.
Resources saved on this page: MySQL 5,00%
Parts of this site powered by vBulletin Mods & Addons from DragonByte Technologies Ltd. (Details)
vBulletin Skin By: PurevB.com