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! ⚽️
我正在开发一个从 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! ⚽️