Python,Unicode:使用格式错误的字符串

时间:2017-10-11 14:58:06

标签: unicode utf-8 python-unicode unicode-normalization unicode-literals

我正在研究从Redshift数据库获取数据的Django应用程序。写信给这个Redshift数据库的人做了一些奇怪的选择。我试图弄清楚如何处理它有这样的字符串的事实:

Let’s play! \xe2\x9a\xbd\xef\xb8\x8f

使用psycopg2我将这些内容作为

进入Python
u'Let\u2019s play! \\xe2\\x9a\\xbd\\xef\\xb8\\x8f'

我应该将其渲染为

  

让我们玩吧! ⚽️

它们以varchar(65535)的形式存储在Redshift表中。我使用pyscopg2将它们拉入app后端(Django 1.11,Python 2.7)。它们在前端使用JavaScript进行渲染。

任何建议都会受到赞赏 - 我根本无法解决任何问题。

1 个答案:

答案 0 :(得分:1)

由于存在混合编码(看起来像Windows-1252和十六进制转义的UTF-8),如果这种混合是一致的,您可以尝试对条目进行后处理。

下面是一个正则表达式,用于查找十六进制转义序列,并用UTF-8解码等效替换它们:

import re

esc = re.compile(r'(?:\\x[0-9a-f]{2})+')

def fixer(m):
    return m.group().encode('latin1').decode('unicode-escape').encode('latin1').decode('utf8')

s = u'Let\u2019s play! \\xe2\\x9a\\xbd\\xef\\xb8\\x8f'
f = esc.sub(fixer,s)
print repr(f)
print f

输出:

u'Let\u2019s play! \u26bd\ufe0f'
Let’s play! ⚽️