首先说明几个常识
1、python默认文件编码为ascii编码
2、我们经常使用utf8来作为文件编码
3、python内部使用unicode编码
4、控制台显示中文使用的是gbk编码
再引出几个问题
1、为什么要用utf8而不是ascii来编码文件?
2、要显示中文是不是要程序员显式将字符编码成gbk编码?
接着来回答这两个问题
1、因为ascii编码较为简单,很多字符不能表示,而utf8可以,故一般常用utf8来编码
2、python解释器以utf8编码读取python源文件,在解释器内部将读取的字符以unicode编码表示,打印到控制台时会自动将unicode编码转换成gbk编码,故不需要程序员显示将字符转换成gbk编码。
用一张图来说明问题
这种对于简单的字符串来说是没有问题的,那假如现在要将一个含中文的python对象转换成json字符串并打印,应该怎么办呢,还是用图来表示
以上两个图可以说是很形象了吧。
那么,我现在来实现一个需求,将一个python字典(有中文)转换成json并打印,并作为参数传到java服务端(java服务端只接受非utf8编码参数会乱码)。下面是源文件
# coding=utf-8
from core12306.core.myUrllib.httpUtils import HTTPClient
import json
def sms(account,from_station,to_station,phone):
httpUtils = HTTPClient()
url = "http://127.0.0.1:5678/sms"
#系统间传參使用驼峰命名(java)
packet = {
'fromStation': 武汉'',
'toStation': '深圳'
}
packetJsonPrint = json.dumps(packet,ensure_ascii=False) #此时 packetJsonPrint 为unicode编码
print "json str is: "
print packetJsonPrint #此时打印到控制台,系统会将unicode编码转换成gbk编码,所以我们能看到中文
packetUtf8 = packetJsonPrint.encode('utf-8') #java服务端使用utf-8编码,此时java服务端不会乱码
response = httpUtils.sendToJavaServer(url=url,data=packetUtf8)
print 'response from sidecar is : '
print response
return response
再配上一个图,抓重点,便于理解
总结:遇到python编码问题一定要记住三点:
1、源文件编码方式
2、字符在python解释器内的编码方式
3、将字符在python解释器内的编码方式转换成需要的编码方式