【Python】Python中字符串的编码分析

前言

现在Python环境可以分为2和3。Python 2.x的开发环境默认编码是ascii,Python 3.x是Unicode。下面就这个编码问题简单讨论一下。

Python 3.x的编码

Python 3.x默认编码是Unicode,也就是说,Python 3.x的字符串是Unicode编码方式,控制台也是。

测试代码

# Python Version:3.5.1

import sys

b_str = b"abcd 1234"
u_str = "abcd 1234 中文"
u_str_a = "abcd 1234".encode('ascii')
u_str_e = "abcd 1234 中文".encode('utf-8')
u_str_gbk = "abcd 1234 中文".encode('gbk')

if __name__ == '__main__':
    print(sys.getdefaultencoding())
    print(b_str)
    print(u_str)
    print(u_str_a)
    print(u_str_e)
    print(u_str_gbk)

打印如下

utf-8
b’abcd 1234’
abcd 1234 中文
b’abcd 1234’
b’abcd 1234 \xe4\xb8\xad\xe6\x96\x87’
b’abcd 1234 \xd6\xd0\xce\xc4’

  • 第一行是打印系统默认的编码,这里是utf-8
  • b_str的字符串前面加了一个b,表示以Ascii方式存储,控制台输出的字符串前面也有一个b,表示这是以Ascii输出;
  • u_str则是默认的字符串,是Unicode编码,控制台输出正常的字符串;
  • u_str_a是从Unicode转码Ascii;
  • u_str_e是从Unicode转码utf-8,实际上,utf-8是Unicode的一种实现方式;
  • u_str_gbk是从Unicode转码GBK,对照u_str_e的输出可见,其中文输出的编码与之不同。

Python 2.x的编码

Python 2.x的默认编码是ascii,控制台暂时不知道是Unicode编码还是utf-8编码。

测试代码

# coding=utf-8

import sys

b_str = b"abcd 1234"
u_str = u"abcd 1234 中文"
u_str_a = u"abcd 1234".encode('ascii')
a_str_u = "abcd 1234".encode('utf-8')
u_str_gbk = u"abcd 1234 中文".encode('gbk')

if __name__ == '__main__':
    print(sys.getdefaultencoding())
    print(b_str)
    print(u_str)
    print(u_str_a)
    print(a_str_u)
    print(u_str_gbk.decode('gbk'))

打印内容如下:

ascii
abcd 1234
abcd 1234 中文
abcd 1234
abcd 1234
abcd 1234 中文

其测试代码类似于Python 3.x的测试代码。
- 第一行打印系统默认的编码方式:ascii
- b_str是测试ascii字符串,其在控制台正常输出,没有Python 3.x控制台下的b
- u_str是以Unicode方式编码的字符串,正常输出;
- u_str_a是Unicode转码成Ascii,然后输出;
- a_str_u是Ascii转码Unicode,然后输出
- u_str_gbk是Unicode转码成GBK,打印的时候需要GBK解码,才能在控制台正常输出。

小技巧

  • 在Python开发中,给字符串前面添加一个b,表示该字符串以Ascii方式编码,添加一个u,表示以Unicode方式编码,这种方式与文件的编码无关。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值