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.
Antworten
Benutzeravatar
__blackjack__
User
Beiträge: 14077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Impulse_VLR: Ja das geht.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@narpfel: Es gibt das `ctypes`-Modul. 😈

Wobei `translate()` vielleicht effizienter ist wenn man mehr als ein Zeichen austauschen möchte.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
Kebap
User
Beiträge: 776
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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?
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

@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.
nezzcarth
User
Beiträge: 1765
Registriert: Samstag 16. April 2011, 12:47

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'
Antworten