一、问题背景
爬虫采集来的文件名中含有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