2017-04-08 12 views
0

データベースに文字列があり、Webサイトで正しく表示できないユニコード文字があります。しかし、それは興味深い一つの状況で正しく動作します。FlaskでUnicode文字を表示できません

だから私はこれを行うとき、それは動作します:

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

しかし、私はこの(データベースを照会し、その結果から文字列を渡す)行うときに、それは動作しません。

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

しかしときに私を私は完全に動作する最初のソリューションで2番目のバージョンから取得すると同じ文字列を使用してください。

誰かが最初の解決法がなぜ機能するのか、なぜ2番目でないのか、私に言うことができたら本当に感謝します。両方の文字列は同じである必要がありますが、私はそれを表示したときに同じままです。私はそれを手動で追加すると、再び良いです。しかし残念ながら私は何百もの弦を持っていますので、2番目のものを使う必要があります。

+1

あなたは 'type( '\ u00e9ps \ u00e9g')'と 'type(text_string)'をチェックできますか? –

+0

getText()メソッドのコードを提供できますか? –

+0

@NilsWerner私は両方のためにを得ました。 – rihe

答えて

1

あなたが持っているものは、1つのユニコード文字を表すユニコードエスケープのシーケンスです。それ以外の場合は、6文字を表すリテラル文字\、u、...があります。これは、Unicodeエスケープシーケンスを無視し、生の文字列を、使用して説明することができます。

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

unicode_escapeコーデックでデコードした後、最初にあなたがバイト文字列を必要とし、リテラルのエスケープシーケンスでUnicode文字列を変換するには。非ASCII文字のリテラルのエスケープコードを持つUnicode文字列からバイト文字列を取得するには、asciiコーデックでそれをエンコード:あなたのコメントから

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

あなたはJSONデータファイルからテキストを有することができます。適切なJSONの場合、これをデコードする必要があります。

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

JSON文字列が引用されています。二重引用符を使わないとデコードできません。

+0

ありがとうございました!ほぼ完璧に動作しています。しかし '\ ud83c \ udf0f'のようなemojisでは、' utf-8 'コーデックは4851番の文字' \ ud83c 'をエンコードできません:サロゲートは許されません。これを引き起こす原因は何ですか?これらは完全な "絵文字コード"ですが、私はそれらの問題点を理解していません。 – rihe

+0

@riheテキストのソースはJSONデータファイルです。 JSONはU + FFFFより上のUnicode文字をUTF-16サロゲートペアとしてエンコードします。私は例を追加します。 –

+0

はい、JSONで、二重引用符も忘れていましたが、今は完全に完璧です!驚くべき答え! – rihe

関連する問題