ubuntuusers.de

Python: HTML-Sonderzeichen nach Unicode konvertieren

Status: Ungelöst | Ubuntu-Version: Ubuntu 9.04 (Jaunty Jackalope)
Antworten |

Arubeto

Anmeldungsdatum:
4. Dezember 2007

Beiträge: 384

Hallo, gibt es eine einfache Möglichkeit, spezielle Zeichen wie Umlaute von ihren html-Kodierungen wie ä für "ä" nach Unicode konvertieren zu lassen? Danke

YEPHENAS

Anmeldungsdatum:
8. Juni 2009

Beiträge: 352

Arubeto schrieb:

Hallo, gibt es eine einfache Möglichkeit, spezielle Zeichen wie Umlaute von ihren html-Kodierungen wie ä für "ä" nach Unicode konvertieren zu lassen? Danke

http://wiki.python.org/moin/EscapingXml

http://wiki.python.org/moin/EscapingHtml

Ersterer Link wird dir wahrscheinlich mehr helfen, da dort ein Beispiel ist, wie man auch unbenannte Zeichenreferenzen wie dein ä unescaped.

tux21b Team-Icon

Avatar von tux21b

Anmeldungsdatum:
15. August 2005

Beiträge: 1698

Wohnort: Linz.at

Hier ist die Funktion von Werkzeug, eine nette Library und Tool-Sammlung für Web bezogene Themen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Extracted from Werkzeug (Copyright: 2009 by the Werkzeug Team, License: BSD)
import re
from htmlentitydefs import name2codepoint

_entity_re = re.compile(r'&([^;]+);')
_entities = name2codepoint.copy()
_entities['apos'] = 39

def unescape(s):
    """The reverse function of `escape`.  This unescapes all the HTML
    entities, not only the XML entities inserted by `escape`.

    :param s: the string to unescape.
    """
    def handle_match(m):
        name = m.group(1)
        if name in _entities:
            return unichr(_entities[name])
        try:
            if name[:2] in ('#x', '#X'):
                return unichr(int(name[2:], 16))
            elif name.startswith('#'):
                return unichr(int(name[1:]))
        except ValueError:
            pass
        return u''
    return _entity_re.sub(handle_match, s)

Ansonsten bin ich mir auch fast sicher, dass die html5lib eine ähnliche Funktion enthält (keine Standardlibrary) und lxml (und zahlreiche anderen XML Libraries aus der Standarlibrary) müsste auch ein paar unescape Funktionen beinhalten (wobei dort dann keine Entities wie "ü" behandelt werden).

Gruß
Christoph

Arubeto

(Themenstarter)

Anmeldungsdatum:
4. Dezember 2007

Beiträge: 384

Vielen Dank für die Antworten. Ich glaube, ich habe meine Frage falsch gestellt. Ich möchte als Rückgabe nicht den Unicode eines Zeichens, sondern das Zeichen selber. Anders ausgedrückt möchte ich eine Funktion, die mir 'ä' (bzw. von mir aus u'ä') zurückliefert, wenn ich sie mit 'ä' als Parameter aufrufe. Benutze ich das Skript von http://wiki.python.org/moin/EscapingXml , bekomme ich den Unicode von 'ä', also '\xc3\xa4' zurück. Ich möchte aber nicht von der Character Reference zum Unicode, sondern von der Character Reference zum Zeichen.

Sorry, falls ich den Zusammenhang zwischen Character References und Unicode falsch verstanden habe. Ich finde das ganze ziemlich verwirrend.

EDIT: Sorry, jetzt beginne ich zu erkennen, was ich falsch mache. Das Problem lag wohl eher daran, dass

>>> '\xc3\xa4'

zu

'\xc3\xa4'

führt und

>>> print '\xc3\xa4'

zu

'ä'

Nutze einige Strings, in denen Umlaute vorkommen, als keys für ein Dictionary und möchte, dass der Benutzer vom Python-Interpreter aus die Keys mit Umlauten eingeben kann. Wenn ich die Dictionaries mit Keys aufrufe, werden die Umlaute in den entsprechenden Keys aber nicht als Umlaute, sondern als Character Reference angezeigt, da sie nicht explizit geprintet werden. Gibt es da eine Möglichkeit, das gleiche Ergebnis wie das eines prints anzuzeigen?

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Arubeto schrieb:

Nutze einige Strings, in denen Umlaute vorkommen, als keys für ein Dictionary und möchte, dass der Benutzer vom Python-Interpreter aus die Keys mit Umlauten eingeben kann. Wenn ich die Dictionaries mit Keys aufrufe, werden die Umlaute in den entsprechenden Keys aber nicht als Umlaute, sondern als Character Reference angezeigt, da sie nicht explizit geprintet werden. Gibt es da eine Möglichkeit, das gleiche Ergebnis wie das eines prints anzuzeigen?

Kannst Du uns da mal ein minimales Code-Beispiel zeigen? Deine Aussagen verwirren mich immer mehr...

Ansonsten generell mal die Standard-Tipps:

Edit: Ah... jetzt habe ich kapiert, was Du willst. Ich würde Dir raten intern immer mit Unicode-Strings arbeiten! (welches Python verwendest Du? 2.x oder schon 3.x?) Ansonsten kann es zu bösen Überraschungen kommen, wenn das Encoding eines anderen Benutzers ein anderes ist und er auf einen Key zugreifen möchte...

tux21b Team-Icon

Avatar von tux21b

Anmeldungsdatum:
15. August 2005

Beiträge: 1698

Wohnort: Linz.at

Python Code selbst besteht (wie der Code aus fast allen Programmiersprachen) aus reinen ASCII Zeichen. D.h. keine Umlaute in Funktionsnamen usw. Programmierer haben damit auch kein Problem, da es einfach so üblich ist (und wenn man englische Namen her nimmt, gibts auch kein Problem damit, und ansonsten muss man die Umlaute halt ausschreiben).

Python ist darüber hinaus, eine der wenigen Programmiersprachen, die ein tollen Unicode Handling mit an Board hat, d.h. Pythonprogramme sind in der Regel auch in der Lage Eingaben von anderen Ländern mit anderen Zeichensätzen zu verarbeiten.

Wichtig ist aber dabei, dass du zwischen dem Programierer und dem Anwender unterscheidest. Ich als Programmierer bevorzuge z.B. durchgehende englische Bezeichnungen und vor allem Fachbegriffe. Der Anwender selbst, möchte aber ein lokalisiertes Interface ohne Fachbegriffe und mit Hilfstexten.

Fazit: Wenn du etwas schreibst was andere Programmierer verwenden sollen, mach dir keine Sorgen wegen der Darstellung und versuche Sonderzeichen generell zu vermeiden. Wenn du hingegen eine Anwendung für Endbenutzer schreibst, dann bastel dir ein schönes Interface (printe etwas in die Konsole, schreibe eine kleine Webanwendung oder mache eine nette GTK GUI). Dort kannst du dann die gesamte Unicode Vielfalt einbinden und der Benutzer wird auch nie eine Escape Sequenz sehen.

Gruß, Christoph

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4687

Wohnort: Berlin

@tux21b: Ab Python 3 wird der Quelltext als Unicode behandelt. Wenn keine Kodierung im Quelltext angegeben wird, nimmt der Compiler UTF-8 an. Da kann man dann alles in Namen verwenden, was als Buchstabe oder Ziffer definiert ist. In IDLE kann man interessanterweise auch bei Python 2.x schon Umlaute und Ähnliches in Namen einbauen!

Und es gibt immer mehr Programmiersprachen, die Zeichen ausserhalb von ASCII in Bezeichnern erlauben. Ich denke das "ASCII-only" wird mit der Zeit aussterben.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

tux21b schrieb:

Python ist darüber hinaus, eine der wenigen Programmiersprachen, die ein tollen Unicode Handling mit an Board hat

Naja, das ist heute auch kein Alleinstellungsmerkmal mehr …

Antworten |