Я получил строку unicode из дикой природы, из-за которой некоторые из наших инструкций psycopg2 терпят неудачу.Строка unicode Python, отклоненная psycopg
я свел проблему вплоть до ВПЧЭ:
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
Основываясь на некоторых из комментариев, стало ясно, что этот конкретный характер составляет половину суррогатной пары, что делает ее недействительной, чтобы жить сама по себе.
В частности, то, я ищу механизм для обнаружения, когда строка содержит неполную суррогатной пары в Python 2.
Один такой метод, который я нашел, что приводит к исключению пытается x.encode('utf16').decode('utf16')
, однако, так как я не полностью понимайте связанные с этим риски, я был бы здесь несколько обеспокоен.
Редактировать: Уменьшенная строка SSCE для одиночного символа, вызывающего проблему, добавлена информация, основанная на комментариях.
Символ представляет [половину суррогатной пары] (Http: //www.fileformat. info/info/unicode/char/d837/index.htm) и не представляет собой собственную кодовую точку. Предположительно, вы получили его через API, который разделяет строку с кодировкой UTF-16, не обращая внимания на границы символов. – user4815162342
@ user4815162342, так как я могу определить, содержит ли данная строка в python какие-либо такие неполные суррогатные пары? –
Просто любопытно, мой ответ помог с вопросом? – user4815162342