2017-04-08 2 views
0

Ich habe einige Zeichenfolgen in meiner Datenbank mit Unicode-Zeichen, die ich nicht richtig auf meiner Website anzeigen kann. Es funktioniert jedoch in einer Situation, die interessant ist.Kann Unicode-Zeichen mit Flask nicht anzeigen

So funktioniert es, wenn ich dies tun:

@app.route('/') 
def main(): 
    return render_template('home.html', text = '\u00e9ps\u00e9g') 
# displays: épség 

Aber es funktioniert nicht, wenn ich dies (die Datenbank abfragen und die Zeichenfolge Ergebnis passieren):

@app.route('/') 
def main(): 
    text_string = getText() 
    return render_template('home.html', text = text_string) 
# displays: \u00e9ps\u00e9g 

Jedoch, wenn ich verwende genau die gleiche Zeichenfolge, die ich von der zweiten Version mit der ersten Lösung bekomme, es funktioniert perfekt.

Ich würde wirklich schätzen, wenn mir jemand sagen könnte, warum die erste Lösung funktioniert und warum nicht die zweite. Beide Strings sollten gleich sein, aber wenn ich sie vom Server bekomme, bleibt sie gleich, wenn ich sie anzeige. Wenn ich es manuell hinzufüge, ist es wieder gut. Leider habe ich Hunderte von Saiten, deshalb muss ich die zweite verwenden.

+1

können Sie 'type ('\ u00e9ps \ u00e9g')' und 'type (text_string)' überprüfen? –

+0

Können Sie den Code Ihrer getText() -Methode angeben? –

+0

@NilsWerner Ich habe für beide. – rihe

Antwort

1

Was Sie in einem Fall haben, ist Unicode-Escape Sequenzen, die ein einzelnes Unicode-Zeichen darstellen. Im anderen Fall haben Sie die Buchstaben \, u, ..., die sechs Zeichen repräsentieren. Dies kann unter Verwendung von rohen Strings dargestellt werden, die Unicode-Escape-Sequenzen ignorieren:

>>> text = '\u00e9ps\u00e9g' 
>>> print(text) 
épség 
>>> text = r'\u00e9ps\u00e9g' 
>>> print(text) 
\u00e9ps\u00e9g 

einen Unicode-String mit wörtlichen Escape-Sequenzen zu konvertieren, müssen Sie zunächst einen Byte-String, dann mit den unicode_escape Codec entschlüsseln. Um ein Byte-String aus einem Unicode-String mit wörtlichen Escape-Codes für Nicht-ASCII-Zeichen zu erhalten, kodieren sie mit dem ascii Codec:

>>> text = r'\u00e9ps\u00e9g' 
>>> print(text) 
\u00e9ps\u00e9g 
>>> print(text.encode('ascii').decode('unicode_escape')) 
épség 

Von Ihrem Kommentar, den Sie Text aus einer JSON-Datendatei haben. Wenn es richtiges JSON ist, sollte es dies decodieren:

>>> s = r'"\u00e9ps\u00e9g \ud83c\udf0f"' 
>>> print(s) 
"\u00e9ps\u00e9g \ud83c\udf0f" 
>>> print(json.loads(s)) 
épség 

Beachten Sie, dass eine JSON-Zeichenfolge angegeben wird. Es würde nicht ohne die doppelten Anführungszeichen entschlüsseln.

+0

Danke Mark! Es funktioniert fast perfekt. Bei einigen Emojis wie '\ ud83c \ udf0f' kommt es jedoch zu einem Fehler: 'utf-8' Codec kann das Zeichen '\ ud83c' in Position 4851 nicht codieren: Surrogate not allowed'. Hast du eine Idee, was das verursachen kann? Dies sind komplette "Emoji-Codes", ich verstehe nicht, was das Problem mit ihnen ist. – rihe

+0

@rihe Die Quelle Ihres Textes kann eine JSON-Datei sein. JSON codiert Unicode-Zeichen über U + FFFF als UTF-16-Ersatzpaare. Ich füge ein Beispiel hinzu. –

+0

Ja, es war JSON und ich vergesse auch die Anführungszeichen, aber jetzt ist es total perfekt! Tolle Antwort! – rihe

Verwandte Themen