[Newbie] Umgang mit Umlauten

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
buebo
User
Beiträge: 2
Registriert: Montag 22. März 2004, 21:01

Montag 22. März 2004, 21:11

Hallo Forum,
als erstes kleines Pythonscript (mal von 'Hello World' abgesehen) versuche ich grade ein Programm zu schreiben das den "Komplexitätsindex" eines Textes berechnet. Dazu lese ich mit read() den ganzen Inhalt als ein String ein und suche dann per findall alle Substantive raus.
Allerdings habe ich ein Problem mit Umlauten, denn aus z.B. 'Missverständniss' wird 'Missverst\xe4', was vor allem schlecht ist weil ich später eigentlich auf die Wortendungen matchen will.
Ich bin mir als Anfänger etwas unsicher wie ich jetzt verfahren soll, kann ich entweder irgendwie die Umlaute zu etwas sinnvollem konvertieren, oder Python dazu bekommen mir die Wörter nicht immer nach den Umlauten abzuschneiden?
Wie geht man am besten damit um?

Gruß & Danke
buebo

P.S.: Ich habe gegoogelt und auch ein paar Sachen gefunden, aber nichts was mir auf Anhieb geholfen hätte, sorry falls ich hier einen alten Hut neu anschneide.
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Montag 22. März 2004, 21:34

Hi. Das kann an sich nicht sein, da \xe4 die interne Darstellung von einem 'ä' ist. Das (e4) ist der Asciiwert von einem 'ä' im Hexadezimalsystem. Das hat allerdings keinen Einfluss auf die Arbeit von Python, nur werden Ergebnisse, wenn man sie ohne print ausgeben lässt, mit repr formatiert. Es wird also kein 'ä' gebildet, sondern eine Escapesequenz aus 4 Buchstaben verwendet, die als 1 Buchstabe (nämlich ä) zählt. Beleg:

Code: Alles auswählen

>>> re.findall('bäc','bb\xe4cc')
['b\xe4c']
>>> re.findall('bäc','bbäcc')
['b\xe4c']
>>> re.findall('b\xe4c','bbäcc')
['b\xe4c']
>>> print re.findall('b\xe4c','bbäcc')[0]
bäc
Ich glaube also, dass du eher in deiner Regex irgendetwas falsch geschrieben hast. Gib die mal an, dann können wir da mal nachschauen, ob was nicht ok ist.

Milan
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 22. März 2004, 21:49

Hi buebo,

das ist ein Problem mit verschiedenen Zeichencodierungen. Am Besten arbeitest Du mit Unicode, also erstmal einen Editor verwenden der Unicode unterstützt. als zweite Zeile in Deinen Scripten

Code: Alles auswählen

# -*- coding: UTF-8 -*-
Nun musst Du noch rausfinden, welcher Codec das auf dem System eingestellt ist. Den liefert die Funktion getfilesystemencoding() aus dem modul sys. In der Regel sind Dateien die auf dem System gespeichert wurden auch in diesem Coding gehalten. Es gibt aber auch Ausnahmen, wie XML HTML oder Pythonscripts. Mit den stringmethoden encode und decode kannst Du dann zwischen verschiedenen Codierungen hin und her convertieren.

Hier noch ein paar Links:
http://p-nand-q.com/python/unicode_faq.html
http://www.reportlab.com/i18n/python_un ... orial.html


Gruß

Dookie
buebo
User
Beiträge: 2
Registriert: Montag 22. März 2004, 21:01

Montag 22. März 2004, 22:36

Milan hat geschrieben: Ich glaube also, dass du eher in deiner Regex irgendetwas falsch geschrieben hast. Gib die mal an, dann können wir da mal nachschauen, ob was nicht ok ist.

Milan
Ok, da hast Du wahrscheinlich recht, allerdings würde ich das gerne erstmal zurückstellen und mich den Zeichensätzen widmen, ich habe immer meine Probleme bei paraleller Problemverarbeitung ;-)
Hi buebo,
das ist ein Problem mit verschiedenen Zeichencodierungen. Am Besten arbeitest Du mit Unicode, also erstmal einen Editor verwenden der Unicode unterstützt. als zweite Zeile in Deinen Scripten
Ich habe leider die Problematik das ich dem Script einfach eine Textdatei übergebem will und das sollte auch von meinen technisch wenig intressierten Kommilitonen geschafft werden und möglichst nicht nur auf einem Unix, sondern auch noch auf einem bestimmten Redmonder Betriebssystem.
Nachdem ich mal deine Links gelesen habe bin ich zu folgendem Ansatz gekommen:

Code: Alles auswählen

#!/usr/local/bin/python
# -*- coding: UTF-8 -*-
from sys import getfilesystemencoding
codierung = getfilesystemencoding()
datei = file('text.txt', 'r')
inhalt = datei.read()
inhalt = inhalt.decode(codierung).encode("UTF-8")
Sieht das für euch vernünftig aus?

Gruß
buebo
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 22. März 2004, 23:40

jo sollte passen mit dem inhalt.decode(codierung).encode("UTF-8")

Gruß

Dookie
Antworten