2017-04-08 79 views
0

显示Unicode字符我有一些字符串我的,我不能在我的网站上正确显示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 

然而使用完全相同的字符串,我从第二个版本中获得第一个解决方案,它完美地工作。

我会很感激,如果有人能告诉我为什么工作的第一个解决方案,为什么没有第二个。这两个字符串应该是相同的,但是当我从服务器获取它时,它保持不变,当我显示它。当我手动添加它时,它又很好。但不幸的是,我有数百个字符串,所以我需要使用第二个字符串。

+1

您可以检查'型( '\ u00e9ps \ u00e9g')'和'型(text_string的)'? –

+0

你能提供你的getText()方法的代码吗? –

+0

@NilsWerner我得到了。 – rihe

回答

1

你在一个案例中有什么是unicode转义序列,代表一个单一的Unicode字符。在另一种情况下,你有文字字符\,你,代表六个字符。这可以使用原始字符串,它忽略Unicode转义序列来说明:

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

Unicode字符串转换与字面转义序列,首先你需要一个字节串,然后用unicode_escape编解码器进行解码。为了获得一个Unicode字符串与非ASCII字符文字转义代码的字节串,与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