UnicodeEncodeError auf Linux

  • Hallo Zusammen,

    ich bin so langsam am Ende, ich erhalte auf OSMC oder Libreelec einen Unicodeerror.

    Code
    UnicodeEncodeError: 'utf-8' codec can't encode characters in position 42-45: surrogates not allowed


    Habe ein Script, was mir ein M3U File erzeugt, was beim Abspielen von Medien mit Sonderzeichen (z.B. äöü) im Dateiname einen Error wirft.
    Der Error tritt unter Windows nicht auf.

    Ich hoffe ihr habt einen Rat für mich, andersfalls zweifle ich schon an, dass die PythonVersion auf Linuxsystemen nicht sauber integriert ist.

  • hab leider schon einiges mit encode und decode ausprobiert, aber ohne Erfolg.
    mit 'surrogateescape' kommt dasnn in der m3u unbrauchbares heraus, was ein laden der m3u nicht möglich macht.
    'replace' ist überhaupt keine lösung, weil das zeichen entfernt.

  • Ich kann auch nur raten, aber ich tippe darauf, dass die Dateinamen mit den Sonderzeichen nicht in UTF-8 kodiert sind. Lass dir mal den Hexcode eines problematischen Dateinamens ausgeben:

    Bash
    printf "%s\n" dateiname | od -t x1 -a

    mCubed HFX Mini, Asus M4A87TD EVO, i3-4330, TBS 6285, Xbox One Digital TV Tuner, Y.A.R.D.2 OLED Special Edition, Pulse8 USB - CEC Adapter, Kodi v19, Tvheadend 4.2, Debian 11

  • Erstmal,
    Python 2.7, oder 3.x ?

    Muss wohl Python 3 sein.

    ja, ist py3

    Ich kann auch nur raten, aber ich tippe darauf, dass die Dateinamen mit den Sonderzeichen nicht in UTF-8 kodiert sind. Lass dir mal den Hexcode eines problematischen Dateinamens ausgeben:

    Bash
    printf "%s\n" dateiname | od -t x1 -a

    schaut dann so aus:

  • Python 3 hat diesen encode/decode Quatsch eigentlich nicht mehr nötig. Leider schreibst du nicht in welcher Zeile dieser Fehler auftritt sonst könnte man direkt helfen.

    Kann aber auch sein, dass ich die Zeilennummern nicht sehe weil ich mit dem Handy unterwegs bin.

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960

    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • den Unicodeerror zum einenkommt in Zeile 27 mit

    Code
    xbmc.[definition='1','0']log[/definition](f'{ADDON_ID}: SRV: {msg}', XBMC_LOG_LEVEL)

    Zeile 27 lässt sich verbessern, wenn ich folgendes davor einfüge:
    msg = msg.encode('utf-8', 'surrogateescape').decode('ISO-8859-1')

    und in Zeile 64 mit

    Code
    m3ufile.write(f'#EXTINF:0,{temp}\n')


    , aber im Grunde bei jeder m3ufile.write(), wenn "Sonderzeichen" im Spiel sind.

  • with open(ADDON_M3UFILE, 'w', encoding='utf-8') as m3ufile:

    Dort nimmst du das encoding='utf-8' raus.

    Die [definition='1','0']log[/definition]/[definition=12,0]debug[/definition] Funktion solltest du nochmal überarbeiten und die Formatierung über f'... vermeiden und stattdessen mit Substitution %s arbeiten.

    Ich würde gerne präziser werden, nur am Handy ist das Sch..sse.

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960

    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • with open(ADDON_M3UFILE, 'w', encoding='utf-8') as m3ufile:

    Dort nimmst du das encoding='utf-8' raus.

    Die [definition='1','0']log[/definition]/[definition=12,0]debug[/definition] Funktion solltest du nochmal überarbeiten und die Formatierung über f'... vermeiden und stattdessen mit Substitution %s arbeiten.

    Ich würde gerne präziser werden, nur am Handy ist das Sch..sse.

    bringt leider nix.

    kenne das %s von py2 und wird für py3 eigentlich nicht mehr verwendet, auch wenn es noh funktioniert.

  • Ich kenne die Spielchen auch nur zugut.
    Unter Libre oder Coreelec funktioniert mMn nur unicode Dateinamen zu schreiben / einzulesen, liegt wohl am locale, bzw am verwendetem Charmap ANSI_X3.4-1968.
    Teste das doch mal aus.

    wie mache ich das?
    die Dateinamen lasse ich mir von Kodi aus der Playlist geben und schreibe es in die m3u.
    die m3u soll dann wieder in den Player geladen werden.

    btw. die Endung m3u8 macht da keinen Unterschied.

  • Mir ist noch nicht klar, ob es um den Dateinamen oder um den Inhalt der Datei geht. Für den Inhalt der Datei stimme ich @PvD zu (Verwendung des binary mode mit 'wb' / 'rb'. Beim Speichern/Lesen im text mode ('w' / 'r') führt Python ein default-Textdecoding mit den Daten durch. Diese Behandlung entfällt mit 'wb' / 'rb'.

    Geht es um den Dateinamen habe ich bisher in meinen Addons noch keine bessere Lösung gefunden als die Konvertierung in ein für alle Kodi-Systeme verdauliches Format (Umlaute übersetzen, alle Sonderzeichen durch Ascii-Zeichen ersetzen, Länge des Dateinamens <= 255 Zeichen).
    /R

  • die pfade der media-dateien werden in die m3u Datei (Playlist im txt-format) geschrieben.
    die mediadateien haben sonderzeichen in ihrer benennung.
    die m3u datei kann dann kodi laden und man hat somit die playlist wieder.
    'wb' erwartet bytes statt stringes, da muss man die codierung selbst übernehmen. würde den gleichen fehler erzeugen.

  • die pfade der media-dateien werden in die m3u Datei (Playlist im txt-format) geschrieben.

    also angelehnt an deinen Quellcode wäre dann ein möglicher Dateiname münchen.m3u?
    /R

  • 0000000 f6 fc f6 fc 44 61 6e 69 65 6c 20 53 74 65 69 64
    v | v | D a n i e l sp S t e i d

    OK, alles klar, wenn man die Bytesequenz durch uchardet jagt, kommt IBM852 als Encoding raus, also die unter MS-DOS übliche Codierung für osteuropäische Sprachen. Das erklärt vermutlich auch, warum es unter Windows funktioniert. Unter Python musst du beim Einlesen des Dateinamens encoding auf den Wert 'cp852' an der richtigen Stelle setzen.

    mCubed HFX Mini, Asus M4A87TD EVO, i3-4330, TBS 6285, Xbox One Digital TV Tuner, Y.A.R.D.2 OLED Special Edition, Pulse8 USB - CEC Adapter, Kodi v19, Tvheadend 4.2, Debian 11

  • Ein einfaches

    Code
    xbmc.[definition='1','0']log[/definition](msg)


    sollte doch schon funktionieren?

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960

    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • leider nicht, selbst sowas einfaches erzeugt den unicodeerror:

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!