Seite 1 von 1

Re: Umlaute in Python

Verfasst: Donnerstag 22. September 2022, 16:38
von __blackjack__
@Impulse_VLR: Ja das geht.

Re: Umlaute in Python

Verfasst: Donnerstag 22. September 2022, 16:55
von narpfel
Hm, ich würde ja sagen, dass es nicht geht. Zeichenketten sind ja schließlich unveränderlich. :twisted:

Aber man kann sich (ohne Veränderung) eine neue Zeichenkette erstellen, bei der die Umlaute ausgetauscht wurden. Mit der passenden Methode von `str` zum Beispiel.

Re: Umlaute in Python

Verfasst: Donnerstag 22. September 2022, 18:10
von __blackjack__
@narpfel: Es gibt das `ctypes`-Modul. 😈

Wobei `translate()` vielleicht effizienter ist wenn man mehr als ein Zeichen austauschen möchte.

Re: Umlaute in Python

Verfasst: Freitag 23. September 2022, 13:23
von Kebap
Wie hilft das ctypes beim Übersetzen von Buchstaben?
https://docs.python.org/3/library/ctypes.html
Oder ist ein anderes gemeint?

@Impulse_VLR
Warum möchtest du ä in "ae", usw. übersetzen und kannst nicht einfach bei den Umlauten bleiben?

Re: Umlaute in Python

Verfasst: Freitag 23. September 2022, 14:32
von narpfel
@Kebap: Das war eine Antwort auf meine Aussage, dass Strings immutable sind. Mit `ctypes` kann man sich den Speicher hinter dem String geben lassen und an Python vorbei verändern. Das hat ... interessante Effekte:

Code: Alles auswählen

#!/usr/bin/env python3

import ctypes
import sys

STRING = "Hello, World!"


def main():
    string_to_modify = "Hello, World!"
    size = sys.getsizeof(string_to_modify)
    ctypes.cast(id(string_to_modify), ctypes.POINTER(ctypes.c_char))[size - 10] = b'p'
    print(STRING)
    print("Hello, World!")


if __name__ == "__main__":
    main()
Das Programm gibt

Code: Alles auswählen

$ python t.py
Hellp, World!
Hellp, World!
aus, obwohl das Programm zwei andere Strings ausgibt und nicht den, der verändert wurde.

Re: Umlaute in Python

Verfasst: Freitag 23. September 2022, 17:53
von nezzcarth
Die gezeigte Variante ist für den Hausgebrauch für die paar Fälle des Deutschen ausreichend.

Wenn es über den Hausgebrauch hinaus geht, bietet sich das Modul PyICU an, das ein Wrapper um die in C++-geschriebene ICU Bibliothek des Unicode-Konsortiums ist und das Problem (neben vielen, vielen anderen) umfassender abhandelt.

Code: Alles auswählen

In [1]: import icu

In [2]: transliterator = icu.Transliterator.createInstance('de-ascii')

In [3]: transliterator.transliterate('Ä Ö Ü ä ö ü ß')
Out[3]: 'AE OE UE ae oe ue ss'