热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

UnicodeEncodeError:‘utf8‘codeccan‘tencodecharactersinposition解决方法

一、问题背景爬虫采集来的文件名中含有emoji以及全角半角符号,但是采集时并没有处理,原封不动存储到了数据中。现在有个需求,从数据库中取出数据,发送跟客户端,客户端拿这文件名写入到


一、问题背景

爬虫采集来的文件名中含有emoji以及全角半角符号,但是采集时并没有处理,原封不动存储到了数据中。现在有个需求,从数据库中取出数据,发送跟客户端,客户端拿这文件名写入到文件缓存。问题出现在缓存到了文件,再从文件取出来的时候,报了unicodeError。

二、解决方法 

1.首先服务端发送特殊字符的时候,json dumps的时候要指定ensure_ascii为False,不编码。保留原字符。

2.这里其实有个标准输出问题,客户端拿到传输的字符,json loads 但是emoji或者/u3000这种全角符号依然会存在,但是使用print打印却不会显示。

ss = '/电视剧/换子成龙 02 主 演: 刘恺威 杜淳 马雅舒 程莉莎.CJBVu5Jsr7I.mp4/shot_00000298_frame_00035267.jpg'
d = {'file_path': ss}
f = json.dumps(d, ensure_ascii=False)
# f 的内容
# '{"file_path": "/电视剧/换子成龙 02 主\u3000演: 刘恺威 杜淳 马雅舒 程莉莎.CJBVu5Jsr7I.mp4/shot_00000298_frame_00035267.jpg"}'
k = json.loads(f)
# k 的内容
# {'file_path': '/电视剧/换子成龙 02 主\u3000演: 刘恺威 杜淳 马雅舒 程莉莎.CJBVu5Jsr7I.mp4/shot_00000298_frame_00035267.jpg'}
# 这时候使用print打印
# 显示 /电视剧/换子成龙 02 主 演: 刘恺威 杜淳 马雅舒 程莉莎.CJBVu5Jsr7I.mp4/shot_00000298_frame_00035267.jpg 结果是正常的
# 但是写如文件
with open('test.txt',w) as f:
f.write(k['file_path'])
# 在文件中打开 依然显示\u3000这个字符
# 采用标准输出流重定向
with open('test.txt', 'wt') as f:
print(k['file_path'], file=f)
# 在文件中打开,显示正常不含\u3000


一、问题背景

爬虫采集来的文件名中含有emoji以及全角半角符号,但是采集时并没有处理,原封不动存储到了数据中。现在有个需求,从数据库中取出数据,发送跟客户端,客户端拿这文件名写入到文件缓存。问题出现在缓存到了文件,再从文件取出来的时候,报了unicodeError。

二、解决方法 

1.首先服务端发送特殊字符的时候,json dumps的时候要指定ensure_ascii为False,不编码。保留原字符。

2.这里其实有个标准输出问题,客户端拿到传输的字符,json loads 但是emoji或者/u3000这种全角符号依然会存在,但是使用print打印却不会显示。

ss = '/电视剧/换子成龙 02 主 演: 刘恺威 杜淳 马雅舒 程莉莎.CJBVu5Jsr7I.mp4/shot_00000298_frame_00035267.jpg'
d = {'file_path': ss}
f = json.dumps(d, ensure_ascii=False)
# f 的内容
# '{"file_path": "/电视剧/换子成龙 02 主\u3000演: 刘恺威 杜淳 马雅舒 程莉莎.CJBVu5Jsr7I.mp4/shot_00000298_frame_00035267.jpg"}'
k = json.loads(f)
# k 的内容
# {'file_path': '/电视剧/换子成龙 02 主\u3000演: 刘恺威 杜淳 马雅舒 程莉莎.CJBVu5Jsr7I.mp4/shot_00000298_frame_00035267.jpg'}
# 这时候使用print打印
# 显示 /电视剧/换子成龙 02 主 演: 刘恺威 杜淳 马雅舒 程莉莎.CJBVu5Jsr7I.mp4/shot_00000298_frame_00035267.jpg 结果是正常的
# 但是写如文件
with open('test.txt',w) as f:
f.write(k['file_path'])
# 在文件中打开 依然显示\u3000这个字符
# 采用标准输出流重定向
with open('test.txt', 'wt') as f:
print(k['file_path'], file=f)
# 在文件中打开,显示正常不含\u3000


推荐阅读
author-avatar
yixianliu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有