【问题标题】:UnicodeEncodeError: 'utf-8' codec can't encode character '\ud83d' in position 388: surrogates not allowedUnicodeEncodeError:“utf-8”编解码器无法在位置 388 编码字符“\ud83d”:不允许代理
【发布时间】:2019-06-29 09:32:37
【问题描述】:

当我尝试使用时:

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,但我不太了解,它也没有回答如何用 pandas 做到这一点。

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 转义此错误。

【问题讨论】:

  • 代码点 D83D 是代理对的第一个元素,第二个元素几乎可以肯定在表情符号范围 DE00–DE4F 中。假设这对中的第二个是 DE04。然后他们一起为代码点 1F604 笑脸张开嘴和微笑的眼睛 ????.
  • 试试编码参数,默认是None
  • 您能否以某种方式本地化,您的数据框中的哪些文本会出现此错误?如果我们能在您的数据框中看到导致此错误的行,这将非常有帮助
  • @Teoretic 我知道错误在 131086,因为我的数据帧被写入到 csv 中的前一行。当我尝试打印这一行时,我得到了同样的错误。 :{

标签: python python-3.x pandas


【解决方案1】:

Unicode 中的表情符号位于基本多语言窗格之外,这意味着它们的代码点不适合 16 位。代理对是一种使这些字形在 UTF-16 中直接表示为一对 16 位代码点的方法。

您可以强制将代理对解析为 BMP 外部的相应代码点,如下所示:

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

这将为您提供代码点\U0001f604。注意它是如何用超过 4 个十六进制数字来表达的。

但这个解决方案可能只能让你走这么远。

很多软件(包括pygame 和旧版本的 IDLE、PowerShell 和 Windows 命令提示符)只支持 BMP,因为它并不真正使用 UTF-16,而是它的前身 UCS-2,它本质上是 UTF-16,但不支持 BMP 之外的代码点。

最初发布此答案时,在 IDLE 3.7 及之前的版本中,print ('\U0001f604') 只会引发 UnicodeEncodeError: 'UCS-2' codec can't encode character '\U0001f604' in position 0: Non-BMP character not supported in Tk

Python 3.8 最终修复了这个问题,并且这些修复被向后移植到 Python 3.7 的后续版本,所以现在在 IDLE 中,您可以提供 17 位代码点:

print ('\U0001f604')

或将 UTF-16 代理对转码为相同的代码点:

print ("\ud83d\ude04".encode('utf-16','surrogatepass').decode('utf-16'))

两者都会打印?

您仍然不能做的是按原样打印 UTF-16 代理对:如果您尝试 print ("\ud83d\ude04"),您将得到相同的 \u 转义。

【讨论】:

  • 感谢您的解释
猜你喜欢
  • 2020-11-06
  • 2017-09-06
  • 1970-01-01
  • 2015-10-21
  • 2010-12-11
  • 2015-01-21
相关资源
最近更新 更多