正在使用 SQLAlchemy 从 SQL Server 数据库的 nvarchar
列中获取一些文本,然后将其写入列类型为 character varying
的 Postgres 数据库。当源数据包含字符 😕 时,Python 抛出以下异常:
UnicodeEncodeError: 'utf-8' codec can't encode character '\ud83d'
in position 34: surrogates not allowed
SQLAlchemy 列类型设置为 String
。我尝试将列类型设置为 Unicode
并将列排序规则分别设置为 SQL_Latin1_General_CP1_CI_AS
,但没有成功。使用的驱动程序是 FreeTDS。
为什么 Python 不能对这个字符串进行编码?问题出在我们使用 SQLAlchemy、Python 或 Postgres 上吗?这个错误让我 😕。
最佳答案
代码点\U1f615 (😕) 可以由两个代理项\ud83d 和\ude15 表示。不知何故,您的内部使用 UTF16 的 SQL-Server 被解码为 UCS2,因此代理无法正确解码。所以问题是SQL-Server。 如果无法正确读取数据,则必须手动更正 unicode 字符串,如下所示 (python3):
def surrogate_to_unicode(sur):
a, b = sur
return chr(0x10000 + ((ord(a)-0xd800)<<10) + (ord(b)-0xdc00))
text = '\ud83d\ude15'
text = re.sub('[\ud800-\udbff][\udc00-\udfff]', lambda g:surrogate_to_unicode(g.group(0)), text)
关于python - 从 SQL Server 到 Postgres 的 '😕' 上的 SQLAlchemy UnicodeEncodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37137411/