从此再也不用为python编码问题头疼了

首先说明几个常识

          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解释器内的编码方式转换成需要的编码方式

猜你喜欢

转载自blog.csdn.net/Lonely_Devil/article/details/81265292