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。我已经提到了这个 问题,但我不太了解,也没有回答如何用熊猫做这件事。

位置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 来避免这个错误。

原文由 Mohit Motwani 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
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 转义。

原文由 BoarGules 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题