UnicodeEncodeError错误求助:utf-8无法编码代理字符问题
问题:处理含阿拉伯语与表情符号的字符串时出现Unicode编码错误
需要处理一段包含阿拉伯语和表情符号的字符串,原代码如下:
thumm= '\u0627\u0644\u0634\u0628 \u0639\u0627\u0645\u0644 \u0634\u0648\u0641\u064a\u0631 \u0627\u0635\u0646\u0635\u064a\u0631 \u0648\u0639\u0645 \u064a\u062d\u0627\u0633\u0628 \u0627\u0644\u0637\u0627\u0644\u0639 \u0648\u0627\u0644\u0646\u0627\u0632\u0644 \u0634\u0648\u0641\u0648 \u0634\u0648 \u0635\u0627\u0631 \u0627\u062e\u0631 \u0634\u064a \ud83d\ude02\u2764\ufe0f' Text= bytes(thumm, "utf-8").decode("unicode_escape",errors='surrogatepass') print(Text)
运行后抛出错误:
UnicodeEncodeError: 'utf-8' codec can't encode characters in position 67-68: surrogates not allowed
目标真实文本为:الشب عامل شوفير اصنصير وعم يحاسب الطالع والنازل شوفو شو صار اخر شي 😂❤️
解决方案
问题根源
你的代码里的thumm变量已经是正确的Unicode字符串,Python会自动解析\uXXXX转义序列和表情符号。但额外执行的bytes(thumm, "utf-8").decode("unicode_escape")操作,反而将原本正确的字符转成了无效的代理对(surrogate pairs),导致后续打印时编码失败。
正确代码
直接使用原字符串即可,无需额外转码:
thumm= '\u0627\u0644\u0634\u0628 \u0639\u0627\u0645\u0644 \u0634\u0648\u0641\u064a\u0631 \u0627\u0635\u0646\u0635\u064a\u0631 \u0648\u0639\u0645 \u064a\u062d\u0627\u0633\u0628 \u0627\u0644\u0637\u0627\u0644\u0639 \u0648\u0627\u0644\u0646\u0627\u0632\u0644 \u0634\u0648\u0641\u0648 \u0634\u0648 \u0635\u0627\u0631 \u0627\u062e\u0631 \u0634\u064a \ud83d\ude02\u2764\ufe0f' print(thumm)
运行后会直接输出目标文本:الشب عامل شوفير اصنصير وعم يحاسب الطالع والنازل شوفو شو صار اخر شي 😂❤️
特殊情况:若字符串是外部获取的原始转义文本
如果thumm是从文件或接口获取的原始转义字符串(比如内容为\\u0627\\u0644...),可按以下方式处理:
# 示例原始转义字符串 thumm_raw = r'\u0627\u0644\u0634\u0628 \u0639\u0627\u0645\u0644 \u0634\u0648\u0641\u064a\u0631 \u0627\u0635\u0646\u0635\u064a\u0631 \u0648\u0639\u0645 \u064a\u062d\u0627\u0633\u0628 \u0627\u0644\u0637\u0627\u0644\u0639 \u0648\u0627\u0644\u0646\u0627\u0632\u0644 \u0634\u0648\u0641\u0648 \u0634\u0648 \u0635\u0627\u0631 \u0627\u062e\u0631 \u0634\u064a \ud83d\ude02\u2764\ufe0f' # 解码转义序列 text = thumm_raw.encode('utf-8').decode('unicode_escape') print(text)
内容的提问来源于stack exchange,提问作者Stephen Matthews
相关产品推荐
相关产品推荐

