导航:首页 > 编程语言 > python语言字符编码

python语言字符编码

发布时间:2023-07-03 08:55:14

A. python有哪几种编码方式

第一种:ASCII码。是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,它是现今最通用的单字节编码系统,并等同于国际标准IS/IEC
646。
由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机李,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母a的编码是97,后128个称为扩展ASCII码。
第二种:GBK和GB2312。能在计算机中显示中文字符是至关重要的,然而ASCII表里一个偏旁部首都没有,所以我们需要一个关于中文和数字对应的关系表,一个字节只能最多表示256个字符,用处理中文显然一个字节是不够的,所以我们需要采用两个字节来表示,所以中国制定了GB2312编码,用来将中文编写进去。
第三种:Unicode。因为各个国家都有一套自己的编码,所以无法避免冲突,因此Unicode诞生了。它可以把所有语言都统一到一套编码里,这样就不会存在乱码问题了,现代操作系统和大多数编程语言都直接支持Unicode。
第四种:UFT-8。基于节约的原则,出现了把Unicode编码转化为可变长编码的UTF-8编码。而UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成一个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节,如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间。

B. 9. 字符编码与Python之文件操作

注意: t和b不能单独使用,必须跟r/w/a连用

补充: 如果文件中有特殊字符, 比如换行, 那么r模式也会读取并返回

补充1: w模式, 在没有关闭文件的情况下, 连续写入数据, 新数据会接着上一次文件指针的位置, 接着写入, 并不会清空源文件

补充2: w模式陵返中, 每次关闭文件后, 连续写入, 那么每次都会把文件先清空, 文件指针回到文件开头, 然后写入数据, 因此, 对于重要的文件, 千万不要用w模式打开写入

-只追加写, 不能读

补充: w和a模式的使用场景

注意: r+模式下, 如果源文件非空, 那么使用write()写数据时, 会从文件开始位置依次覆盖, 因为r模式打开文件时, 会把文件指针移动到文件最开始

注意: w+虽然可以读文件了, 但是只要打开文件, 内容就会被清空.

w+和a+的特性:

a模式打开文件, 文件指针是在文尺山件末尾的, 读不出来内容, w模式打开世轿文件会清空, 所以也读不出来内容

总结

准备文件

补充:

准备文件

准备文件

C. Python2.7 中文字符编码,使用Unicode时,选择什么编码格式

  1. 终端显示字符的编码(windows下终端是cmd,linux下是各种terminal,远程登录是putty或者xshell)

  2. shell环境的编码。比如中文版windows用的是gbk(向下兼容gb2312),大多数linux发行版使用的是utf-8(LANG=zh_CN.UTF-8)。

  3. 文本文件的编码。这个通常取决于你的编辑器,而且有的编辑器支持多种编码的话,你可以在文本开头位置指定编辑器使用特定编码。比如# -*- coding: utf8 -*-,vim看到这行会默认将这个脚本认定为utf-8兼容编码格式。

  4. 应用程序的内部编码。一个字符串,作为数据只是一个字节数组,但是作为字符的数组,就有一个解析方式。java和python的内部字符编码是utf-16,python和java都支持用不同的编码来对字节数组进行decode来得到字符数组。

D. python语言中的如何输入编号叫什么

Python 默认脚本文件都是 ANSCII 编码的,当文件 中有非 ANSCII 编码范围内的字符的时候就要使用"编码指示"来修正。 一个mole的定义中,如果.py文件中包含中文字符(严格的说是含有非anscii字符),则需要在第一行或第二行指定编码声明:

# -*- coding=utf-8 -*-或者 #coding=utf-8 其他的编码如:gbk、gb2312也可以; 否则会出现类似:SyntaxError: Non-ASCII character '/xe4' in file ChineseTest.py on line 1, but no encoding declared; see http://www.pytho for details这样的异常信息;n.org/peps/pep-0263.html

命令查看脚本默认的编码方式
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>>

2.2 python中的编码与解码

先说一下python中的字符串类型,在python中有两种字符串类型,分别是str和unicode,他们都是basestring的派生类;str类型是一个包含Characters represent (at least) 8-bit bytes的序列;unicode的每个unit是一个unicode obj;所以:

len(u'中国')的值是2;len('ab')的值也是2;

在str的文档中有这样的一句话:The string data type is also used to represent arrays of bytes, e.g., to hold data read from a file. 也就是说在读取一个文件的内容,或者从网络上读取到内容时,保持的对象为str类型;如果想把一个str转换成特定编码类型,需要把str转为Unicode,然后从unicode转为特定的编码类型如:utf-8、gb2312等;

2.2.1 print 语句解释编码问题

print 是打印默认的编码方式,相当于对任何对象encode编码转化成str对象。默认是gbk的编码就是对Unicode进行自动的gbk编码,再按照gbk编码输出。

当print语句碰到一个unicode目标的时候,会用当前python shell环境的默认编码格式首先对unicode对象进行encode(此时unicode对象已经变成了一个str对象了),然后再以默认编码格式为基础,根据其包含的汉字和编码的对应规则,把这个str对象解释成中文并显示出来。但是当print语句碰到的直接是个str目标的时候,就不管其从unicode转到str时用的编码格式是什么,直接用默认编码格式的对应规则来解释成中文。所以,当unicode对象转换成str时的编码格式和print语句的默认编码格式不一致的时候就会出现乱码现象。比如在cmd的python shell里面:

复制代码
复制代码
证明Python 系统默认编码gbk
>>> s= '你好'
>>> s
'\xc4\xe3\xba\xc3'
>>> s = u'你好'
>>> s
u'\xc4\xe3\xba\xc3'
>>> s = '你好'
>>> s
'\xc4\xe3\xba\xc3'
>>> print type(s)
<type 'str'>
>>>unicode 编码打印错误,print 解析字符串而不是Unicode 编码
>>> s = u'你好'
>>> print s
ÄãºÃ
>>>uni = u'你好' #存入一个unicode对象
>>>print uni
你好 #可以正常显示 相当于Unicode.encode(gbk)
>>>uni.encode("gbk")
'\xc4\xe3\xba\xc3' #显示的是个str对象了,如果type(uni.encode("gbk"))得到的就是str对象
>>>print uni.encode("gbk")
你好 #可以正常显示,因为在cmd下的pythonshell里默认个编码格式就是gbk,gbk解析
>>>uni.encode("utf-8")
'\xe4\xbd\xa0\xe5\xa5\xbd' #可以看到,encode用的编码格式不同,编成的字符串也是不同的
>>>print uni.encode("utf-8")
浣犲ソ #乱码,因为用了gbk中汉字和字符串编码格式对应规则去解释了用utf-8编码成的字符串。解释的编码格式不对应。
#######さらに######
>>>print '\xc4\xe3' #自己写出来的这么个字符串(前面不加r)的话也会被print解释成中文,按照编码格式输出

>>>print uni.encode("utf-8").decode("gbk")
浣犲ソ
'''
乱码,而且和上面的乱码一样,这是因为,在uni被utf-8 encode之后,这个对象变成了str对象,是'\xe4\xbd\xa0\xe5\xa5\xbd' 这个。
后来,它又被按照gbk的规则解码,又变回了unicode,但是此时它在内存里的二进制数据已经和最初的uni不一样了。
最初的uni,应该是'\xc4\xe3\xba\xc3'.decode("gbk"),而现在的这个东西,他decode之前的字符串已经变过了。
这么一个东西再拿去print,又把它编码成了gbk格式,相当于前面那步decode没有做,变回了'\xe4\xbd\xa0\xe5\xa5\xbd'。
再解释成汉字,当然就和最开始用uni编码成utf-8格式再解释成汉字的乱码一样了
'''

复制代码

2.2.2 脚本print 打印的正确方式

上面已经证明了系统的默认编码方式是gbk,就是print 最后正确的编码方式应该是gbk

两种解决编码不匹配的情况:

一是明确的指示出 s 的编码方式
# -*- coding: utf-8 -*-
s = '中文'
s.decode('utf-8').encode('gb2312')
二是更改 sys.defaultencoding 为文件的编码方式
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys
reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入
sys.setdefaultencoding('utf-8')
str = '中文'
str.encode('gb2312')

三、实践经验中爬取数据的获得

复制代码
# -*- coding: utf-8 -*-
'''
#加油两个字可以很好的比较编码正确和错误
#### 错误的处理方式,
s = "中文"
print s
#这里print就不是输出gbk的编码,是按照头文件utf-8的格式输出
# 结果:中文
print s.decode('utf-8')
#结果中文,s进行解码称为Unicode,print打印就和系统print打印一样自动将Unicode进行
#解码,不用encode编码也能输出,但是最好转化成为字符串输出。
上面实例就是错误使用编码,错误使用编码会出现个别字体的乱码。
'''

'''
要点1、声明头文件# -*- coding: utf-8 -*- 说明所有的代码和中文是utf-8的编码方式
要点2、print输出函数输出到前台cmd中的默认系统编码方式是GBK,
要点3、尽量将Unicode转化成为字符串str (gbk或者utf-8),再去处理。

#unicode 转化成为字符串
s = u'加油'
print s
#结果:加油。原因:系统自动将Unicode升级gbk编码成为字符串,然后系统print 打印gbk
print s.encode('utf-8')
#结果:锷犳补。错误原因:Unicode 编码成为utf-8的字符串形式,但是print打印系统是gbk的,编码冲突。
print s.encode('gbk')
#结果:加油。原因:和print s等价,认为编码了gbk,系统打印
ss = "加油"
print ss
#结果:锷犳补。原因:ss为utf-8的字符串str,print 打印的对应编码字符串是gbk的,所以编码冲突。
print ss.decode('utf-8').encode('gbk')
#结果:加油。原因:ss首先从字符串编码utf-8解码成为unicode,然后进行编码gbk,等价使用print ss.decode('utf-8')。
'''

'''
3.1python中关于中文转换url编码的问题
爬虫的时候我们经常会碰到中文链接编码出现变换的问题,
例如'丽江'中文在url的地址编码却是'%E4%B8%BD%E6%B1%9F',
因此需 要做一个转换。这里我们就用到了模块urllib。
'''
import urllib
data = '丽江'
print data.decode('utf-8').encode('gbk')
#对utf-8的中文编码
print urllib.quote(data)
#那我们想转回去呢?
print urllib.unquote('%E4%B8%BD%E6%B1%9F').decode('utf-8').encode('gbk')

'''
'丽江'在网页编码是gbk的转换码是'%C0%F6%BD%AD',utf-8中的转化码是'%E4%B8%BD%E6%B1%9F',其实是编码问题。
网络的是gbk,其他的一般网站比如google就是utf8的。所以可以用下列语句实现。
'''

#江苏课题的编码转化
import sys,urllib
s = '江苏'
print urllib.quote(s.decode(sys.stdin.encoding).encode('gbk'))
print urllib.quote(s.decode(sys.stdin.encoding).encode('utf8'))

for place in ['南京','无锡','徐州','常州','苏州','盐城','南通','连云港','淮安','盐城','扬州']:
print urllib.quote(place)

####################
#结果:
'''
>>>
丽江
%E4%B8%BD%E6%B1%9F
丽江
%E4%B8%BD%E6%B1%9F
%E6%B6%93%E8%8A%A5%E7%9D%99
>>>
'''

E. python怎么知道一个字符串的编码方式

字符串的编码,有很多种如utf-8,gb2312,gbk,gb18030,bz2,zlib,big5,bzse64
python 对编码的处理有两个方法,decode()和 encode()方法
a = '你好'b = 'python'print a.decode('utf-8').encode('gbk')##decode方法把字符串转换为unicode对象,然后通过encode方法转换为指定的编码字符串对象print b.decode('utf-8')##decode方法把字符串转换为unicode对象所以要让python(或者说机器)来识别字符串的编码,是一件很困难的事。编码就是汉字和整数之间的对应,同一个整数,可以在不同的编码中,都有对应的汉字。比如下面的例子,比特流'\xe6\xb0\xb4\xe5\xa3\xb6'在四种编码中都有对应的汉字,但只有在utf-8编码下,它对应的汉字才有意义。我们可以一眼看出这点,可是要让计算机做到这点,就很难了。
>>> s = '水壶'>>> s18: '\xe6\xb0\xb4\xe5\xa3\xb6'>>> print unicode(s, 'big5')瘗游ㄥ>>> print unicode(s, 'gbk')姘村6>>> print unicode(s, 'gb2312')姘村6>>> print unicode(s, 'utf-8')水壶

F. python3字符串都是什么编码

编码

字符串是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。

因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295。

由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。

Unicode

Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。

Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。

现在,捋一捋ASCII编码和Unicode编码的区别:ASCII编码是1个字节,而Unicode编码通常是2个字节。

字母A用ASCII编码是十进制的65,二进制的01000001;

字符0用ASCII编码是十进制的48,二进制的00110000,注意字符'0'和整数0是不同的;

汉字已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101。

如果把ASCII编码的A用Unicode编码,只需要在前面补0就可以,因此,A的Unicode编码是00000000 01000001。

新的问题又出现了:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。

所以,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间:

字符

ASCII

Unicode

UTF-8

A 01000001 00000000 01000001 01000001

中 x 01001110 00101101 11100100 10111000 10101101

从上面的表格还可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

搞清楚了ASCII、Unicode和UTF-8的关系,我们就可以总结一下现在计算机系统通用的字符编码工作方式:

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:

浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:

所以你看到很多网页的源码上会有类似<meta charset="UTF-8" />的信息,表示该网页正是用的UTF-8编码。

Python的字符串

在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言,例如:

>>> print('包含中文的str')
包含中文的str

对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:

1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。

在操作字符串时,我们经常遇到str和bytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。

Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行

#!/usr/bin/env python3# -*- coding: utf-8 -*-

第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

格式化:

在Python中,采用的格式化方式和C语言是一致的,用%实现,举例如下:

format % (...params)
>>> 'Hello, %s' % 'world''Hello, world'>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)'Hi, Michael, you have $1000000.'

%运算符就是用来格式化字符串的。在字符串内部,%s表示用字符串替换,%d表示用整数替换,%x表示16进制整数,有几个%?占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?,括号可以省略。

格式化整数和浮点数还可以指定是否补0和整数与小数的位数:

>>> '%2d-%02d' % (3, 1)' 3-01'>>> '%.2f' % 3.1415926'3.14'

有些时候,字符串里面的%是一个普通字符怎么办?这个时候就需要转义,用%%来表示一个%:

>>> 'growth rate: %d %%' % 7'growth rate: 7 %'

阅读全文

与python语言字符编码相关的资料

热点内容
局域网如何用ftp服务器配置 浏览:70
程序员惯性思考模式 浏览:439
如何在个税app上查身份证号 浏览:6
电视家app安装在电视上怎么安 浏览:889
怎么将pdf格式转化为图片格式 浏览:637
服务器拔掉raid卡怎么装系统 浏览:232
区域对称加密算法 浏览:245
数字转汉字php 浏览:733
安卓源码硬件驱动 浏览:208
痰证pdf 浏览:814
电脑怎么把word文档转pdf 浏览:867
程序员那么可爱有孩子了吗 浏览:480
安卓文字折叠怎么使用 浏览:885
创造一个app如何挣钱 浏览:801
php55vc11 浏览:642
抖音如何关闭苹果app充值 浏览:332
python多个文件调用 浏览:792
java算法和数据结构 浏览:465
糖豆视频的文件夹 浏览:654
php的头部文件一般在哪个文件里 浏览:560