【发布时间】:2016-11-15 23:30:26
【问题描述】:
我收到了一个来自野外的 unicode 字符串,导致我们的一些 psycopg2 语句失败。
我已将问题简化为 SSCE:
import psycopg2
conn = psycopg2.connect(...)
cur = conn.cursor()
x = u'\ud837'
cur.execute("SELECT %s", (x,))
print cur.fetchone()
运行它会产生以下异常:
Traceback (most recent call last):
File ".../run.py", line 65, in <module>
cur.execute("SELECT %s AS test", (x,))
psycopg2.DataError: invalid byte sequence for encoding "UTF8": 0xed 0xa0 0xb7
根据一些 cmets,很明显这个特殊角色是代理对的一半,因此无法独立生活。
具体来说,我正在寻找一种机制来检测 Python 2 中字符串何时包含不完整的代理对。
我发现一种导致异常的方法是尝试x.encode('utf16').decode('utf16'),但是,由于我并不完全了解相关的风险,所以在这里我会有些担心。
编辑:将 SSCE 字符串缩减为导致问题的单个字符,添加了基于 cmets 的信息。
【问题讨论】:
-
该字符代表one half of a surrogate pair,并不代表它自己的代码点。大概您是通过一个 API 获得的,该 API 将一个 UTF-16 编码的字符串拆分,而不注意字符边界。
-
@user4815162342 那么如何检测python中的给定字符串是否包含任何此类不完整的代理对?
-
只是好奇,我的回答对这个问题有帮助吗?
标签: python postgresql unicode psycopg2