0

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

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

使用 psycopg2 我将这些作为

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

我应该把它渲染为

让我们玩!⚽️

它们以varchar(65535). 我正在使用 pyscopg2 将它们拉入应用程序后端(Django 1.11、Python 2.7)。它们在前端使用 JavaScript 进行渲染。

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

4

1 回答 1

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! ⚽️
于 2017-10-11T17:00:31.817 回答