python undecode和str区别与转换

1.str和undecode介绍

str和unicode都是basestring的子类
python 在内部使用两个字节来存储一个unicode,使用unicode对象而不是str的好处,就是unicode方便于跨平台。

str是字节串,由unicode经过编码(encode)后的字节组成的

unicode才是真正意义上的字符串,由字符组成

字符是指计算机中使用的字母、数字、字和符号,包括:1、2、3、A、B、C、~!·#¥%……—*()——+等等。在 ASCII 编码中,一个英文字母字符存储需要1个字节。在 GB 2312 编码或 GBK 编码中,一个汉字字符存储需要2个字节。在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节。在UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。在UTF-32编码中,世界上任何字符的存储都需要4个字节。

搞明白要处理的是str还是unicode, 使用对的处理方法(str.decode/unicode.encode) (decode(解码)/encode(编码))

2.头部编码声明

文件头部编码声明决定了python解析源码中的str的编码选择方式,比如头部声明的是utf-8编码,则代码中s=”中文”python就会按照utf-8编码格式来解析
在python源代码文件中如果有用到非ascii字符,比如中文,那么需要在源码文件头部声明源代码字符编码,格式如下:

#-*- coding: utf-8 -*-

这个格式看起比较复杂,其实python只检查#、coding,编码等字符串,可以简写成#coding:utf-8,甚至还可以写成#coding:u8。

3.使用

你可以用如下两种方式定义一个unicode:

s1 = u"哈哈"
s2 = unicode("哈哈", "utf-8")

设置defaultencoding

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

unicode转str

# coding=utf-8
import sys
reload(sys)
#设置编码
sys.setdefaultencoding('utf-8')

s=u'哈哈'

u=s.encode()
print 'str:',type(s)
print '转化后格式',type(u)


str: <type 'unicode'>
转化后格式 <type 'str'>


#当没有设置defaultencoding时代应该加上指定编码格式,结果一样
# coding=utf-8

s=u'哈哈'
u =s.encode('utf-8')#加入参数
print 'str:',type(s)
print '转化后格式',type(u)

如果你在python代码中进行编码和解码的时候,不指定编码方式,那么python就会使用defaultencoding。 而python默认的编码为ascii

str转unicode

比如你使用str创建unicode对象时,如果不说明这个str的编码格式,那么程序也会使用defaultencoding进行对str的解码。(默认方式为ascii)

u = unicode(“哈哈”) 等价于 u = unicode(“哈哈”,defaultencoding)
例如

# coding=utf-8

s='哈哈'
u =unicode(s)
print type(u)


UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

#正确代码
# coding=utf-8

s='哈哈'
u =unicode(s,'utf-8')
print type(u)

<type 'unicode'>

#或者提前设置defaultencoding

# coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

s='哈哈'
u =unicode(s)
print type(u)

<type 'unicode'>

结论:
默认的defaultencoding(ascii)不能对中文进行解码,而不能解码,也意味着不能编码成想要的格式。所以,要设置defaultencoding的默认值,或者每次解码编码的时候去给它指定值。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值