web-dev-qa-db-ja.com

UnicodeEncodeError: 'utf-8'コーデックは388桁目の文字 '\ ud83d'をエンコードできません:サロゲートは許可されていません

私が使用しようとすると:

df[df.columns.difference(['pos', 'neu', 'neg', 'new_description'])].to_csv('sentiment_data.csv')

エラーが発生します:

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

このエラーの意味と、このエラーを修正してcsv/Excelにデータをエクスポートする方法を理解できません。私はこれに言及しました question が、私は多くを理解しておらず、パンダでこれを行う方法に答えていません。

ポジション388の意味? 「\ ud83d」という文字は何ですか?

Excelにエクスポートしようとすると、別のエラー位置が表示されます。

df[df.columns.difference(['pos', 'neu', 'neg', 'new_description'])].to_Excel('sentiment_data_new.xlsx')

Excelへのエクスポート中にエラーが発生しました:

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

同じエンコーディングで位置が異なるのはなぜですか?

他の重複する質問は、pandas DataFrame。

3
Mohit Motwani

この回答はコメントに応答し、コメント自体を入れるには長すぎます。

Unicodeの絵文字は、基本多言語ペインの外側にあります。サロゲートペアは、これらのグリフを2つのコードポイントとしてUTF-16で直接表現できるようにする方法です。

サロゲートペアを強制的にBMPの外の対応するコードポイントに解決することができます:

_>>> "\ud83d\ude04".encode('utf-16','surrogatepass').decode('utf-16')
'\U0001f604'
_

しかし、この解決策は今のところあなたを得るだけかもしれません。

多くのソフトウェア(IDLEなど)はBMPのみをサポートしています。これは、実際にはUTF-16を使用していないため、その前身であるUCS-2は本質的にUTF-16ですが、BMP外のコードポイントはサポートされていないためです。 IDLEでは、print ('\U0001f604')は_UnicodeEncodeError: 'UCS-2' codec can't encode character '\U0001f604' in position 0: Non-BMP character not supported in Tk_を発生させるだけです

7
BoarGules