encode,decode的使用和编码问题

Zss 发表于:

一直以来编码都是一个头疼的事情,每次都是遇到一次解决一次,没有对编码的使用方式进行系统的总结,导致每次虽然解决了

但是花的时间变长了,而且一直不清楚到底是为什么导致的这种情况,每次都是通过修改系统的默认编码来解决的,但是不是最好的办法

应该更加熟练地使用encode和decode两个字符的函数来解决

字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,那么unicode成为一个桥梁吧这么理解

    decode                 encode
str ---------> str(Unicode) ---------> str

  1. decode的作用是将其他编码的字符串转换成unicode编码。
    如str1.decode(‘gbk’),表示将gbk编码的字符串str1转换成unicode编码。
  2. encode的作用是将unicode编码转换成其他编码的字符串。
    如str2.encode(‘gbk’),表示将unicode编码的字符串str2转换成gbk编码
  3. 在使用encode时,有些字符可能编码不出来,那么使用加入errors=’ignore’,对可以直接忽略   str.decode(“gbk”,errors=‘ignore’)

1.一个字符串有他的编码,那么使用decode(这个字符串的编码方式)进行解码,解码后他就变成了unicode类型了,再次使用encode(想要编码成什么方式)进行编码

所以知道他原始的字符串的编码方式是什么变得很重要了

2.当一个字符串本来就是unicode时,那么我们直接使用encode(想要编码成什么方式)来进行编码

那么怎么判断一个字符串是不是unicode呢?可以使用这么一个函数

isinstance(s,unicode)

若是unicode时返回True,若不为unicode返回False

#coding:utf-8
s='中文'
s=s.decode('utf-8')   #将utf-8编码的解码成unicode
print isinstance(s,unicode)   #此时输出的就是True

s=s.encode('utf-8')           #又将unicode码编码成utf-8
print isinstance(s,unicode)   #此时输出的就是False

这时候脚本默认设置的是使用UTF-8的编码方式来运行的,那么s的字符是utf-8的编码方式,所以使用utf-8来解码成unicode,解码后判断为True

再次使用encode来编码成utf-8,此时又变成了Utf-8,那么判断为False

当我设置为#coding:gbk,此时的decode(’utf-8’)则报错,因为他的编码方式不正确,若该成gbk则正常运行

几种文件创建时的乱码问题,因为win下的cmd窗口和文件夹好像都是gbk的编码方式,所以创建中文文件夹时,编码需要使用为gbk

1.当脚本使用的gbk编码时,直接创建一个中文文件夹

#coding:gbk
import os
b = '你好'
os.makedirs(os.getcwd()+'\\'+ b)

2.当字符串为unicode时,需要将其编码成gbk

import os
a = u'\u4f60\u597d'
os.makedirs(os.getcwd()+'\\'+a.encode('gbk'))
#coding:utf-8
import os
b = u'你好呀'
os.makedirs(os.getcwd()+'\\'+ b.encode('gbk'))

3.当脚本使用的utf-8时,先将其解码成unicode,再转化成gbk来创建

#coding:utf-8
import os
b = '你好呀'
os.makedirs(os.getcwd()+'\\'+ b.decode('utf-8').encode('gbk'))

4.判断是否为unicode,是则直接encode(),不是则进行解码再进编码,但是这中间的设置和脚本的编码设置也有关系

#coding=gbk
s=u"中文"

if isinstance(s, unicode):
    print s.encode('utf-8')
else:
    print s.decode('gbk').encode('utf-8')