Probleme mit Umlaute in Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
__blackjack__
User
Beiträge: 13995
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@nezzcarth: ``iconv`` ist auch eine Idee. Ich hatte die EBCDIC-Kodierung(en) mit Python selbst gefunden:

Code: Alles auswählen

#!/usr/bin/env python3
import codecs
import encodings
from functools import partial
from pathlib import Path


def is_text_encoding(name):
    try:
        codecs.lookup(name)
        #
        # Try encoding a string to filter out non text encodings.
        #
        "".encode(name)
    except (LookupError, UnicodeError):
        return False
    else:
        return True


def test_encoding(source_text, expected_result, encoding_name):
    try:
        return source_text.encode(encoding_name) == expected_result
    except UnicodeEncodeError:
        return False


def main():
    encodings_path = Path(encodings.__file__).parent
    candidates = (path.stem for path in encodings_path.glob("*.py"))
    encoding_names = sorted(filter(is_text_encoding, candidates))
    print(f"Checking {len(encoding_names)} encodings...")
    print(list(filter(partial(test_encoding, "Ü", b"\xfc"), encoding_names)))


if __name__ == "__main__":
    main()
Ausgabe:

Code: Alles auswählen

Checking 110 encodings...
['cp037', 'cp1140', 'cp500']
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
nezzcarth
User
Beiträge: 1748
Registriert: Samstag 16. April 2011, 12:47

@Sirius3: Wenn ich es so mache, wie von dir beschrieben, klappt es zwar in der Tat nicht (weder mit UTF16 noch Windows 1252), allerdings sind die Fehlermeldungen noch mal komplett andere, als die aus dem Eingangspost.

@__blackjack__: Letztendlich bin ich bei folgendem gelandet, wobei dann ohne Aliase nur noch 29 Encodings übrig bleiben:

Code: Alles auswählen

#!/bin/bash

for encoding in $(awk '$1~/module/&&$2!~/INTERNAL/{print $2}' /usr/lib/gconv/gconv-modules.d/gconv-modules-extra.conf /usr/lib/gconv/gconv-modules | tr -d '/'|sort -u ); do
	echo -n "Ü"| iconv -f "utf8" -t "$encoding"  2>/dev/null| od -An -tx1 | grep -q 'fc' && echo "$encoding"
done 
Ausgabe:

Code: Alles auswählen

EBCDIC-CA-FR
IBM037
IBM1047
IBM1112
IBM1122
IBM1130
IBM1140
IBM1142
IBM1143
IBM1144
IBM1145
IBM1146
IBM1147
IBM1148
IBM1149
IBM1153
IBM1156
IBM1157
IBM1164
IBM256
IBM277
IBM278
IBM280
IBM284
IBM285
IBM297
IBM500
IBM870
IBM871
Zuletzt geändert von nezzcarth am Mittwoch 4. Juni 2025, 19:59, insgesamt 1-mal geändert.
Benutzeravatar
__blackjack__
User
Beiträge: 13995
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@nezzcarth: Hey, ich habe das über Python gelöst, und bekomme auch 29 Ergebnisse:

Code: Alles auswählen

#!/usr/bin/env python3
from collections import defaultdict
from functools import partial
from pathlib import Path

import iconv

MODULES_FILE_PATH = Path("/usr/lib/x86_64-linux-gnu/gconv/gconv-modules")


def parse_gconf_modules(lines):
    names = []
    name_to_aliases = defaultdict(list)
    for line in lines:
        line = line.rstrip()
        if line and not line.startswith("#"):
            match line.split():
                case "alias", alias, name:
                    name_to_aliases[name.removesuffix("//")].append(
                        alias.removesuffix("//")
                    )

                case "module", source, target, _module_name, _cost:
                    if source == "INTERNAL":
                        names.append(target.removesuffix("//"))

                case _:
                    raise ValueError(f"unexpected line {line!r}")

    assert len(names) == len(set(names))
    assert all(name in names for name in name_to_aliases)
    return {name: name_to_aliases[name] for name in names}


def test_encoding(utf_8_source, expected_result, encoding_name):
    try:
        return (
            iconv.open(encoding_name, "utf-8").iconv(utf_8_source)
            == expected_result
        )
    except iconv.error:
        return False


def main():
    with MODULES_FILE_PATH.open(encoding="ascii") as lines:
        name_to_aliases = parse_gconf_modules(lines)
        print(f"Checking {len(name_to_aliases)} encodings...")
        result_names = sorted(
            filter(
                partial(test_encoding, "Ü".encode("utf-8"), b"\xfc"),
                name_to_aliases,
            )
        )
        print(f"Found {len(result_names)} results:")
        print(result_names)


if __name__ == "__main__":
    main()
Ausgabe:

Code: Alles auswählen

Checking 271 encodings...
Found 29 results:
['EBCDIC-CA-FR', 'IBM037', 'IBM1047', 'IBM1112', 'IBM1122', 'IBM1130', 'IBM1140', 'IBM1142', 'IBM1143', 'IBM1144', 'IBM1145', 'IBM1146', 'IBM1147', 'IBM1148', 'IBM1149', 'IBM1153', 'IBM1156', 'IBM1157', 'IBM1164', 'IBM256', 'IBM277', 'IBM278', 'IBM280', 'IBM284', 'IBM285', 'IBM297', 'IBM500', 'IBM870', 'IBM871']
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Peter17
User
Beiträge: 6
Registriert: Montag 2. Juni 2025, 09:48
Wohnort: Teningen

Hallo,

könnt Ihr mir gute deutschsprachige Bücher über Python3 empfehlen, die sich für das erlernen dieser Sprache eignen?
Benutzeravatar
__blackjack__
User
Beiträge: 13995
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das Tutorial aus der Python-Dokumentation gibt es auch auf Deutsch: https://pytude.readthedocs.io/de/latest/

Ansonsten würde ich eher nach Büchern zum Englisch lernen suchen. 😇
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
noisefloor
User
Beiträge: 4171
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

könnt Ihr mir gute deutschsprachige Bücher über Python3 empfehlen, die sich für das erlernen dieser Sprache eignen?
Es gibt kein hier im Forum bekanntes. "Bekannt" ist das Buch "Python 3 - das umfassende Handbuch", was hier im Forum einen legendär schlechten Ruf hat, weil besonders die älteren Auflagen viele Fehler hatten und "unpythonisch" waren.

Zum Lernen braucht's heutzutage auch IMHO kein Buch mehr, es gibt genug (gute) Online Ressourcen. Am Ende der deutschen Übersetzung des Python-Tutorial sind auch noch ein paar weitere Ressourcen verlinkt.

Gruß, noisefloor
nezzcarth
User
Beiträge: 1748
Registriert: Samstag 16. April 2011, 12:47

Ich habe mit einer früheren Ausgabe des Buchs, das jetzt "Think Python" heißt, gute Erfahrungen gemacht; neben Print-Ausgaben ist es auch frei verfügbar. Die aktuelle englische Originalausgabe ist weiterhin auch frei verfügbar: https://greenteapress.com/wp/think-python-3rd-edition/. Davon gibt es auch eine deutsche Übersetzung (aber wohl nur als gedrucktes Buch; da fehlt dann natürlich die interaktive Komponente): https://dpunkt.de/produkt/python-lernen-mit-ki-tools/. Dass der Einbezug von AI jetzt vergleichsweise stark beworben wird, irritiert mich, allerdings fand ich das Original gut genug, dass ich mir vorstellen kann, dass es trotzdem etwas ist. Daher ist das keine Empfehlung, sondern nur ein Hinweis, falls du es mal im Buchladen oder eine Bibliothek siehst, vielleicht mal reinzugucken. Gutes deutschsprachiges Material ist ein eher begrenzt vorhanden.
Antworten