Python Variable mit Umlauten umwandeln [Unicode]

peace_maker

Cadet 4th Year
Registriert
Dez. 2010
Beiträge
108
Ahoi liebe Community,

ich hab vor ein paar Tagen mit Python angefangen und hätte folgende Frage für euch :) :

Ich würde gerne einen String, der "üäö" enthält gerne "verarbeitungs- bzw. ausgabefähig" machen.

Code:
# -*- coding: utf-8 -*-

string = "Test üäö ßßß"
print string

Ich weiß, dass ich mittels string= u"Test üäö ßßß" die gewünschte Ausgabe erhalten würde, allerdings funktioniert die Variante in meinem Programm nicht, da ich dort meinen Quelltext über eine Homepage bekomme und dieser in der Variable direkt gespeichert wird. Deshalb wollte ich erst einmal in einem Miniprogramm meine Möglichkeiten austesten um die Lösung dann auf mein anderes Programm anzuwenden.

Lange Rede kurzer Sinn:
Wie kann eine Variable in Unicode(?) konvertieren ?

Ein Kollege meinte , dass das mittels "import unicodedata" möglich sei, allerdings habe ich bisher noch keine Lösung finden können.

Danke vorab schon einmal für eine helfende Hand.

greeting
peace_maker

PS: Ja, die Suchfunktion des Forums habe ich genutzt, allerdings kein auf mein Problem anwendbaren Thread gefunden.
 
Wo genau ist denn jetzt überhaupt erstmal das Problem?

Bei Python 3 sind afaik ausnahmslos alle Strings Unicode-Strings. Wenn man jetzt überall da, wo man seine Quellcode-Dateien herumschieben will, dafür sorgt, dass das ganze auch als UTF-8 gespeichert und ausgegeben wird, sollte es kein Problem sein.
 
Zusammenfassung:
- Text mit "üßöä" wird in "data" gespeichert.
- Textfilter steigt aus, weil er mit F"\xfc"rst nix anfangen kann

Wie kann ich "\xfc" und andere Umlaute, die in der Variablen stehen umändern ?

Textfilter:
data = re.search('<p><b>(?P<name>.*?)</b><br />[\n\t]*(?P<strasse>.*?)<br />.*?'
'<a href="index.php\?plz=[0-9]+">(?P<plz>.*?)</a> <a '
'href="index.php\?buchstabe=[A-Z]">(?P<stadt>.*?)</a>'
'</p>.*?<p>Telefon: (?P<telefon>.*?)( ?.*?)</p>.*?'
'<p>Fax: (?P<fax>.*?)</p>.*?'
'.*?(href="(?P<www>.*?)" target)?', data, re.DOTALL)
 
Zuletzt bearbeitet: (Code von Textfilter hinzugefügt)
Mit Python kenn ich mich jetzt nicht aus, aber ich schätze dein Problem hat nix mit UTF8 zu tun, sondern mit der fehlenden Maskierung von Escape-Sequenzen (Sonderzeichen). Oder hast du dies schon bedacht?
 
Hallo peace_maker

Wie VikingGe schon gesagt hat, würde ich darauf achten, dass die Dateien auch mit UTF-8 abgespeichert werden. Notfalls Notepad++ und hier die Kodierung auswählen (UTF-8 ohne BOM).

Grüsse
n0NamE
 
ahoi,

Ich arbeite mit notepad++, UTF-8 ohne BOM ist drin. Der Datensatz, den ich in die CSV-Datei schreiben will, endhält nach dem filtern \xfc,\xf6 etc..

Die Datensätze, die das enthalten werden nicht in die CSV-Datei geschrieben, deswegen hab ich schon allerlei ausprobiert (nur nicht das richtige).

von data = data.decode
über

Code:
text = ''
for zeichen in zeile:
# ü
	if zeichen == '\xfc':
		text +='\xc3\xbc'
#ö
	elif zeichen == '\xf6':
		text +='\xc3\xb6'
#ä
	elif zeichen == '\xe4':
		text +='\xc3\xa4'
#ß
	elif zeichen == '\xdf':
		text +='\xc3\x9f'
#Ä
	elif zeichen == '\xc4':
		text +='\xc3\x84'
#Ö
	elif zeichen == '\xd6':
		text +='\xc3\x96'
#Ü
	elif zeichen == '\xdc':
		text +='\xc3\x9c'
	else:
		text += zeichen
zeile = text
zeile = zeile.decode('utf-8')
print zeile
was im testprogramm klappt, allerdings nicht im richtigen Programm, weil ich dann die Meldung bekomme, dass er hierbei keinen unterschied feststellen kann, was ich nachvollziehen kann, allerdings gehen mir die Ideen aus, zumal ich mich mit dem Thema Python noch nicht wirklich auskenne.

Ich mach für heute erstmal schluss und schau mir das die Tage nochmal an.

greetings
peace_maker
 
Zuletzt bearbeitet:
VikingGe schrieb:
Bei Python 3 sind afaik ausnahmslos alle Strings Unicode-Strings. Wenn man jetzt überall da, wo man seine Quellcode-Dateien herumschieben will, dafür sorgt, dass das ganze auch als UTF-8 gespeichert und ausgegeben wird, sollte es kein Problem sein.

Das print-Statement im Code des OP's legt nahe, dass er Python 2 nutzt. In Python 3 ist print ja eine Funktion.
Ergänzung ()

NACHTRAG: Ah, du bekommst den Stringinhalt aus einer externen Quelle! Probier mal:

stringFromExternalSource = someFunction()
print stringFromExternalSource.decode("utf-8")

2. Nachtrag: Meh, peace_maker hatte diesen Vorschlag bereits gemacht. Sorry, ich hatte nicht den kompletten Thread gelesen.

3. Nachtrag: Oh Mann, wo habe ich heute meinen Kopf?? :freak: peace_maker __ist__ der OP!
 
Zuletzt bearbeitet:
Ich habe ein kleines Quick n' Dirty Beispiel Skript geschrieben, welches einen String mit Unicode-Escape-Sequenzen per RegEx durchsuchen soll.
Eine direkte Rekodierung mittels decode('utf-8') schlägt fehl. Um den String in eine Unicode-Zeichenkette umzuwandeln, wird auf decode('unicode-escape') zurückgegriffen.

Dann sucht das Skript per re.search() beide Zeicheketten nach dem Wort "schön", welches als "String", "Rawstring", "Unicode", "RawUnicode", "Escaped", usw. vorliegt.

Code:
# -*- coding: utf-8 -*-

import re

tmpString = 'Ich bin sch\xf6n!'
print tmpString
print repr(tmpString)
print str(type(tmpString)) + "\n"

try:
   tmpStringU = tmpString.decode('utf-8')
except Exception as e:
   print e

tmpStringU = tmpString.decode('unicode-escape')
print "\n" + tmpStringU
print repr(tmpStringU)
print str(type(tmpStringU)) + "\n"

dictSearch = {'strUml'    : 'schön', 
              'rawUml'    : r'schön', 
              'uniUml'    : u'schön', 
              'uniRawUml' : ur'schön',
              'strEsc'    : 'sch\xf6n', 
              'rawEsc'    : r'sch\xf6n', 
              'uniEsc'    : u'sch\xf6n',
              'uniRawEsc' : ur'sch\xf6n'}

dictStrings = { "tmpString" : tmpString, "tmpStringU" : tmpStringU }

for i in dictSearch: 
   for j in dictStrings:
      result = re.search(dictSearch[i], dictStrings[j])

      if result is None:
         result = "NICHT gefunden"
      else:
         result = result.group()
         
         if isinstance(result, str):
            result = result.decode('unicode-escape')
            

      print u'{0:10}  -  {1:10}  -  re.search: {2:20}'.format(i, j, result)

OUTPUT
Code:
Ich bin schön!
'Ich bin sch\xf6n!'
<type 'str'>

'utf8' codec can't decode byte 0xf6 in position 11: invalid start byte

Ich bin schön!
u'Ich bin sch\xf6n!'
<type 'unicode'>

rawEsc      -  tmpStringU  -  re.search: schön               
rawEsc      -  tmpString   -  re.search: schön               
strEsc      -  tmpStringU  -  re.search: schön               
strEsc      -  tmpString   -  re.search: schön               
strUml      -  tmpStringU  -  re.search: NICHT gefunden      
strUml      -  tmpString   -  re.search: NICHT gefunden      
uniRawEsc   -  tmpStringU  -  re.search: schön               
uniRawEsc   -  tmpString   -  re.search: schön               
rawUml      -  tmpStringU  -  re.search: NICHT gefunden      
rawUml      -  tmpString   -  re.search: NICHT gefunden      
uniRawUml   -  tmpStringU  -  re.search: schön               
uniRawUml   -  tmpString   -  re.search: schön               
uniUml      -  tmpStringU  -  re.search: schön               
uniUml      -  tmpString   -  re.search: schön               
uniEsc      -  tmpStringU  -  re.search: schön               
uniEsc      -  tmpString   -  re.search: schön

Im Anhang sind noch weitere Beispiele, aber wichtig, alles nur Quick n' Dirty.
Möchte damit nur zeigen, dass sich String und Unicode nicht immer vertragen.
Bei RegExp sollte man aufpassen, wenn man mischt.
 

Anhänge

  • unicodeC.txt
    1,1 KB · Aufrufe: 242
  • unicodeB.txt
    1,2 KB · Aufrufe: 229
  • unicodeA.txt
    1,1 KB · Aufrufe: 215
Zurück
Oben