Python,Unicode:处理格式错误的字符串

Python, Unicode: Working with badly formatted strings

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

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

使用 psycopg2,我将这些放入 Python 作为

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

我应该将其呈现为

Let’s play! ⚽️

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

如有任何建议,我们将不胜感激——我根本想不出任何解决方案。

因为混合了编码(看起来像 Windows-1252 和十六进制转义的 UTF-8),如果这种混合是一致的,您可以尝试 post 处理条目。

下面是一个正则表达式,用于查找十六进制转义序列并将它们替换为 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! ⚽️