Python,Unicode:处理格式不正确的字符串



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

Let’s play! xe2x9axbdxefxb8x8f

使用 psycopg2,我将这些作为 Python 获取

u'Letu2019s play! \xe2\x9a\xbd\xef\xb8\x8f'

我应该将其呈现为

我们来玩吧! ⚽️

它们作为 varchar(65535) 存储在 Redshift 表中。我正在使用pyscopg2将它们拉入应用程序后端(Django 1.11,Python 2.7)。它们在前端使用 JavaScript 渲染。

任何建议将不胜感激 - 我根本无法找到任何解决方案。

因为存在混合编码(看起来像 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'Letu2019s play! \xe2\x9a\xbd\xef\xb8\x8f'
f = esc.sub(fixer,s)
print repr(f)
print f

输出:

u'Letu2019s play! u26bdufe0f'
Let’s play! ⚽️

最新更新