Unicode mit Umlaute in String umwandeln

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
LukLuk
User
Beiträge: 11
Registriert: Montag 22. Juni 2015, 14:36

Hallo Zusammen,

ich schreibe gerade eine Funktion wo ich einen String z.B. "Hällo" in "H\C3\A4llo" umgewandelt wird.

Jetzt habe ich aber das Problem das ich einen Unicode-String bekomme und dadurch meine Funktion nichtmehr richtig funktioniert.

Wie kann ich einen Unicode-String in einen normalen String indem der Umlaut noch vorhanden ist?

Die Funktion:

Code: Alles auswählen

def encodetoLdap(string):
    #print type(string)
    alpha=True
    newchar=""
    outputString=""
    for c in string:
        if(c.isalpha()==False and c!=" " and c!="=" or alpha==False):
            newchar=newchar+hex(ord(c)).replace('0x','\\').upper()
            if alpha==False:
                alpha=True
                outputString=outputString+newchar
                newchar=""

            else:
                alpha=False
        else:
            outputString=outputString+c
    return outputString
BlackJack

@LukLuk: Die Beschreibung und auch das was die Funktion da macht erscheint mir etwas wirr. Du solltest Dich mal mit Unicode-Objekten und „normalen Strings“ ausseinandersetzen, denn Du hast das in der Beschreibung etwas verquer. Normale Strings enthalten keine Buchstaben also auch keine Umlaute sondern einfach nur Bytewerte. Die können wenn man sie mit einer passenden Kodierung betrachtet auch Bytes enthalten die einen Umlaut darstellen würden in einer richtigen *Zeichen*kette. Und *richtige* *Zeichen*ketten die auch tatsächlich Umlaute als Zeichen enthalten können sind Unicode-Objekte.

Falls Du alle Bytewerte ausserhalb von ASCII in Escape-Sequenzen der Form \?? mit ?? zwei Hexadezimalziffern umwandeln möchtest, dann musst Du schon Bytewerte also `str` in diese Funktion geben. Und die solltest Du dann auch so umschreiben das die Implementierung eher wie der erste Satz dieses Absatzes aussieht und nicht mit dieser komischen Bedingung und dem `alpha`-Flag, was zum Beispiel problematisch wird wenn ein Zeichen in UTF-8 kodiert nicht zwei sondern drei Bytes braucht. Und den \ selbst berücksichtigt Deine Funktion auch nicht. Wenn der in der Eingabe vorkommt, kannst Du das nicht mehr immer eindeutig dekodieren. Selbst wenn \ nie in der Eingabe vorkommen kann, würde ich zumindest darauf prüfen und gegebenfalls eine Ausnahme auslösen oder zumindest ein ``assert`` dafür schreiben.

`hex()` und dann '0x' abschneiden und `upper()` anwenden ist umständlich, man kann das viel einfacher über `format()` lösen in dem man mit dem Formatstring direkt zwei grossbuchstabige Hex-Ziffern fordert, ohne irgendeinen Präfix.

Byteketten bekommt man aus Unicode-Zeichenketten in dem man sie kodiert. Mit der `encode()`-Methode und der Angabe der Zeichenkodierung die man gerne hätte.
LukLuk
User
Beiträge: 11
Registriert: Montag 22. Juni 2015, 14:36

Ah danke das mit dem "unicode.encode()" hat geholfen.
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@LukLuk: um es nochmal deutlich zu sagen, das Encoding ist nur eins der vielen Probleme, die Deine Funktion hat. Hast Du sie schon einmal für beliebige Zeichen getestet?

Code: Alles auswählen

result = re.sub('[^\w =]', lambda s:'\\%02X' % ord(s.group(0)), string.encode('utf8'))
Antworten