2016-05-10 5 views
1

一部のテキストは、SQLAlchemyを使用してSQL Serverデータベースのnvarchar列からフェッチされ、列タイプがcharacter varyingのPostgresデータベースに書き込まれます。 SQLAlchemyのカラム型がStringに設定されているSQLAlchemy UnicodeEncodeError on '' SQL ServerからPostgresへ

UnicodeEncodeError: 'utf-8' codec can't encode character '\ud83d' 
in position 34: surrogates not allowed 

:ソースデータが文字が含まれている場合Pythonは、次の例外がスローされます。列の種類をUnicodeに設定し、別に列の照合順序をSQL_Latin1_General_CP1_CI_ASに設定してみました。使用されているドライバはFreeTDSです。

なぜこの文字列をPythonでエンコードできないのですか?問題は、SQLAlchemy、Python、Postgresの使用にありますか?このエラーは私を作っています。

答えて

0

コードポイント\ U1f615()は、2つのサロゲート\ ud83dと\ ude15で表すことができます。何らかの形で、内部的にUTF16を使用するSQLサーバーがUCS2としてデコードされたため、サロゲートが適切にデコードされません。したがって、問題はSQL Serverです。 データを正しく読み込めない場合は、そのように(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) 
関連する問題