0%

python乱码

本文整理遇到过的python3乱码、中文输出异常问题,会持续更新。

http响应

以天气预报的接口为例http://www.weather.com.cn/data/sk/101010100.html

浏览器访问,默认会得到乱码。在浏览器中设置编码之后(菜单 - 更多 - 文字编码 - Unicode),正常显示中文。

liulanqi_1

liulanqi_2

用此可知,此网站响应内容在Unicode编码下可正常显示中文。于是设置requests对象的编码格式为unicode

1
2
3
4
5
6
7
8
# -*- coding: utf-8 -*-
import requests

url = 'http://www.weather.com.cn/data/sk/101010100.html'
r = requests.get(url)
r.encoding = 'unicode'
data = r.text
print(data)

运行结果:

1
{"weatherinfo":{"city":"北京","cityid":"101010100","temp":"27.9","WD":"南风","WS":"小于3级","SD":"28%","AP":"1002hPa","njd":"暂无实况","WSE":"<3","time":"17:55","sm":"2.1","isRadar":"1","Radar":"JC_RADAR_AZ9010_JB"}}

对于json格式的响应,可以尝试使用json模块处理:

1
2
data = json.loads(response)
data = json.dumps(data, ensure_ascii=False)

读取文件

python3中默认使用unicode编码,文件读写基本不会出现问题;若有稀奇古怪的问题,可依次排查以下条件:

  • 欲读取文件的编码格式
  • 代码中明确指定的编码格式
  • 操作系统/终端当前的默认编码格式(代码未明确指定时使用)
1
2
3
4
5
6
7
8
import sys
print('default encoding: %s' % sys.getdefaultencoding())

myfile = 'a.txt'
with open(myfile) as f:
data = f.read()

print(data)

运行结果:

1
2
3
4
5
6
# file a.txt 
a.txt: UTF-8 Unicode text
# ./read_file.py
default encoding: utf-8
我简直太帅了。
I am so handsome.

比如同样的代码,在windows上运行有以下错误:

1
2
UnicodeDecodeError: 'gbk' codec can't decode byte 0xab in position 33: illegal multibyte sequence
default encoding: utf-8

open()函数中添加encoding='utf-8'参数后正常。

1
2
3
4
5
6
7
8
import sys
print('default encoding: %s' % sys.getdefaultencoding())

myfile = 'txt/name.txt'
with open(myfile, encoding='utf-8') as f:
data = f.read()

print(data)

输出结果:

1
2
default encoding: utf-8
諸葛亮|關羽|劉備|曹操|孫權|關羽|張飛|呂布|周瑜|趙雲|龐統|司馬懿|黃忠|馬超