You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中处理字符'�'?解决Salesforce数据Unicode编码错误

问题

从Salesforce读取数据存入Pandas DataFrame后,打印时触发Unicode编码错误,操作流程如下:

  • 执行查询获取数据:
# query to execute
sql_code = """ Select Id, ResponseShortText FROM SurveyQuestionResponse """

# get data
df_xyz_raw = pd.DataFrame(sf.query_all(query = sql_code)["records"])
  • 打印时出现错误:
    UnicodeEncodeError: 'utf-8' codec can't encode character '\ud83d' in position 229: surrogates not allowed

尝试过以下编码解码代码,仅靠errors='ignore'生效,但会丢失字符:

df_xyz_raw ["ResponseShortText"] = df_xyz_raw ["ResponseShortText"].str.encode('utf-8', errors='ignore').str.decode('utf-8')

疑问:

  • 是否是不属于UTF-8的表情符号导致?
  • 源系统和Python环境Unicode格式是否不同?
  • 有没有办法正常处理该字符并打印?

解决方案

错误原因

\ud83d是Unicode代理对的单独一半(属于UTF-16编码机制),并非完整的表情符号字符。UTF-8不允许单独存在未配对的代理字符,因此编码时触发错误。Salesforce返回的数据可能在传输过程中出现了UTF-16代理对拆分的问题,本质上源系统和Python都基于Unicode,只是编码形式(UTF-8/UTF-16)转换时出现异常。

具体处理方法

方法1:用ftfy库自动修复损坏文本

ftfy库专门用于修复各种Unicode文本问题,能自动识别并还原拆分的代理对:

  1. 安装库:
pip install ftfy
  1. 处理DataFrame列:
import ftfy

df_xyz_raw["ResponseShortText"] = df_xyz_raw["ResponseShortText"].apply(lambda x: ftfy.fix_text(x) if isinstance(x, str) else x)

该方法会保留完整的表情符号,不会丢失有效内容。

方法2:手动清理未配对代理字符

如果不想额外安装库,可用正则匹配并删除未配对的代理字符:

import re

def fix_surrogates(text):
    if not isinstance(text, str):
        return text
    # 匹配单独存在的UTF-16代理字符并删除
    return re.sub(r'[\ud800-\udbff](?![\udc00-\udfff])|(?<![\ud800-\udbff])[\udc00-\udfff]', '', text)

df_xyz_raw["ResponseShortText"] = df_xyz_raw["ResponseShortText"].apply(fix_surrogates)

此方法仅清理损坏的代理字符,保留其他正常内容。

方法3:调整打印时的错误处理

如果仅需解决打印报错,无需修改原数据,可在打印时指定错误处理策略:

print(df_xyz_raw.to_string().encode('utf-8', errors='replace').decode('utf-8'))

errors='replace'会将无法编码的字符替换为�,避免报错同时保留其他内容。

内容的提问来源于stack exchange,提问作者flubber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 15:07:17