python编码x
㈠ python 字符集编码 - UTF-8 编码
Unicode 的编码范围为 0~0x10FFFF ,如此大的范围,显然没办法像 ASCII 编码一样使用一个字节存储。为此,Unicode 制定了各种储存编码的方式,如: UTF-8 、 UTF-16 和 UTF-32 ,这些存储格式被称为 Unicode 转换格式 UTF 。
每种 Unicode 转换格式都会把一个编码存储为一到多个编码单元,如 UTF-8 的编码单元为 8 位的字节; UTF-16 的编码单元为 16 位,即 2 个字节; UTF-32 的编码单元为 32 位,即 4 个字节。
其中, UTF-8 是在互联网上使用最广泛的一种 Unicode 转换格式,具有以下显着的优势。下面,我们就先来看看 UTF-8 具有哪些有点吧~
1. UTF-8 中每个 ASCII 字符只需要一个字节去存储,因此一个 ASCII 文本本身也是一个 UTF-8 文本,即做到了向后兼容。
比如 A 的 ASCII 码对应为 0x41 , a 的 ASCII 码对应为 0x61 ,那么 UTF-8 兼容 ASCII 也就意味着:
这里,需要再次提醒一下:Unicode 是表现形式,UTF-8 是存储形式;即 UTF-8 解码之后为 Unicode ,Unicode 可以编码成 UTF-8 。
2. UTF-8 采用字节为存储单元,因此不存在字节的大端和小段的问题。
UTF-16 和 UTF-32 的存储单元分别是 2 字节和 4 字节,因此在存储时会涉及到大小端的问题。那什么是大小端模式呢?下面我们来暂停补充一下~
关于如何获知你的环境使用的是大端模式还是小端模式,这里有个简单的方式:定义一个 short 类型的数组即可:
数字 1 在 short 类型中表示为 0x0001 ,高位为 0x00 ,低位为 0x01 。我们可以很直观地看到,数组在保存数据时,将高位 0x00 放在了高地址处,将低位 0x01 放在了低地址处。因此使用的就是小端模式。
那 UTF-8 为什么可以使用字节来作为存储单元,而不用担心字节序的问题呢?这就涉及到了 UTF-8 巧妙的编码规则~
UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用 1~4 个字节表示一个符号,根据不同的符号而变化字节长度。UTF-8的编码规则很简单,只有二条:
1)对于单字节符号,字节的第一位设为 0 ,后 7 位为这个符号的 Unicode 码。也就是我们上文提到的向后兼容:对于英文字母,UTF-8 编码和 ASCII 码是相同的。
2)对于使用 X 个字节存储的符号,第一个字节的前 X 位设置为 1 ,第 X+1 位设置为 0 ,后面字节的前 2 位一律设置为 10 ,剩下的位置一次填充这个符号的 Unicode 码。
下表总结了编码规则,字母 x 表示可用于编码的位:
跟据上表,解读 UTF-8 编码也非常简单:如果一个字节的第一位是 0 ,则这个字节单独就是一个字符;如果第一位是 1 ,则连续有多少个 1 ,就表示当前字符占用多少个字节。
下面,我们就来演示一下 UTF-8 编码的过程。
首先,获取汉字 鱼 的 Unicode 码:
我们不妨先对 鱼 这个汉字使用 utf-8 编码看看使用几个字节存储:
鱼 在 UTF-8 编码中使用 3 个字节存储,因此其存储的二进制的形式为 1110xxxx 10xxxxxx 10xxxxxx ,将 Unicode 1001 110001 111100 依次填充到占位符 x 的位置就得到: 11101001 10110001 10111100 。
下面,我们将上述推导得出的 11101001 10110001 10111100 转换为十六进制,验证一下是否为 b'xe9xb1xbc' :
验证无误!
㈡ 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编码就能节省空间。
㈢ python3.x默认使用的编码是什么
Python3.X 默认使用的编码是 utf-8
㈣ python编码问题
python的默认的编码是ascii: 指的是你写代码默认是编码是ascii 编码的, 当然你也可以改成你想要的编码,比如在开头写个注释就用utf8编码 # -*-coding:UTF-8-*-
字符串在Python内部的表示是unicode编码: 这个是python 3 以后才是这样的吧, 中文可以直接在字符串里用了,而python<3的版本得这么用 u'中文' 表示unicode编码
㈤ python是什么编码格式
python编码总结:
1).首先python有两种格式的字符串,str和unicode,其中unicode相当于字节码那样,可以跨平台使用。
str转化为unicode可以通过unicode(),u,str.decode三种方式
unicode转化为str,如果有中文的话,一般通过encode的方式
2).如果代码中有中文的话,我们一般会添加 "# coding=utf-8",这个是什么作用呢,一般如下:
如果代码中有中文注释,就需要此声明比较高级的编辑器(比如我的emacs),会根据头部声明,将此作为代码文件的格式。程序会通过
头部声明,解码初始化 u”人生苦短”,这样的unicode对象,(所以头部声明和代码的存储格式要一致
所以,当我们填上编码头的时候,使用s="中文",实际上type(s)是一个str,是已经将unicode以utf-8格式编码成str。
其次,如果我们在代码中使用s=u'中文',相当于将str以utf-8解码成unicode。
推荐学习《python教程》。
㈥ python3.4 编码有哪些
Python3中的编码问题前,第一个段落对字节、ASCII与Unicode与UTF-8等进行基本介绍,如果不对这几种编码犯头晕,可直接跳过。
ASCII与Unicode与UTF-8与GBK
首先从老大哥说起。跟很多人一样,大学读了这么久,久仰ASCII编码的大名。要说这个老大哥,我们再先从字节说起。一个字节包括八个比特位,每个比特位表示0或1,一个字节即可表示从00000000到11111111共2^8=256个数字。一个ASCII编码使用一个字节(除去字节的最高位作为作奇偶校验位),ASCII编码实际使用一个字节中的7个比特位来表示字符,共可表示2^7=128个字符。比如那时写C语言的程序,就经常要背下ASCII编码中的01000001(即十进制的65)表示字符‘A’,01000001加上32之后的01100001(即十进制的97)表示字符‘a’。现在打开Python,调用chr和ord函数,我们可以看到Python为我们对ASCII编码进行了转换。
第一个00000000表示空字符,因此ASCII编码实际上只包括了
字母、标点符号、特殊符号等共127个字符。因为ASCII是在美国出生的,对于由字母组成单词进而用单词表达的英文来说也是够了。但是中国人、日本人、
韩国人等其他语言的人不服了。中文是一个字一个字,ASCII编码用上了浑身解数256个字符都不够用。
因此后来出现了Unicode编码。Unicode编码通常由两个字节组成,共表示256*256个字符,即所谓的UCS-2。某些偏僻字还会用到四个字节,即所谓的UCS-4。也就是说Unicode标准也还在发展。但UCS-4出现的比较少,我们先记住:最原始的ASCII编码使用一个字节编码,但由于语言差异字符众多,人们用上了两个字节,出现了统一的、囊括多国语言的Unicode编码。
在Unicode中,原本ASCII中的127个字符只需在前面补一个全零的字节即可,比如前文谈到的字符‘a’:01100001,在Unicode中变成了00000000 01100001。不久,美国人不开心了,吃上了世界民族之林的大锅饭,原本只需一个字节就能传输的英文现在变成两个字节,非常浪费存储空间和传输速度。
人们再发挥聪明才智,于是出现了UTF-8编码。因为针对的是空间浪费问题,因此这种UTF-8编码是可变长短的,从英文字母的一个字节,到中文的通常的三个字节,再到某些生僻字的六个字节。解决了空间问题,UTF-8编码还有一个神奇的附加功能,那就是兼容了老大哥的ASCII编码。一些老古董软件现在在UTF-8编码中可以继续工作。
注意除了英文字母相同,汉字在Unicode编码和UTF-8编码中通常是不同的。比如汉字的‘中’字在Unicode中是01001110
00101101,而在UTF-8编码中是11100100 10111000
10101101。
我们祖国母亲自然也有自己的一套标准。那就是GB2312和GBK。当然现在挺少看到。通常都是直接使用UTF-8。记得我唯一一次看到GB编码的网页,是一个成人网站。
Python3中的默认编码
Python3中默认是UTF-8,我们通过以下代码:
import sys
sys.getdefaultencoding()
可查看Python3的默认编码。
Python3中的encode和decode
Python3中字符编码经常会使用到decode和encode函数。特别是在抓取网页中,这两个函数用的熟练非常有好处。我的理解,encode的作用,使我们看到的直观的字符转换成计算机内的字节形式。decode刚好相反,把字节形式的字符转换成我们看的懂的、直观的、“人模人样”的形式。如下图。
\x表示后面是十六进制,\xe4\xb8\xad即是二进制的11100100 10111000
10101101。也就是说汉字‘中’encode成字节形式,是11100100 10111000
10101101。同理,我们拿11100100
10111000 10101101也就是\xe4\xb8\xad来decode回来,就是汉字‘中’。完整的应该是b'\xe4\xb8\xad',在Python3中,以字节形式表示的字符串则必须加上前缀b,也就是写成上文的b'xxxx'形式。
前文说的Python3的默认编码是UTF-8,所以我们可以看到,Python处理这些字符的时候是以UTF-8来处理的。因此从上图可以看到,就算我们通过encode('utf-8')特意把字符encode为UTF-8编码,出来的结果还是相同:b'\xe4\xb8\xad'。
明白了这一点,同时我们知道UTF-8兼容ASCII,我们可以猜想大学时经常背诵的‘A’对应ASCII中的65,在这里是不是也能正确的decode出来呢。十进制的65转换成十六进制是41,我们尝试下:
b'\x41'.decode()
结果如下。果然是字符‘A’
Python3中的编码转换
据说字符在计算机的内存中统一是以Unicode编码的。只有在字符要被写进文件、存进硬盘或者从服务器发送至客户端(例如网页前端的代码)时会变成utf-8。但其实我比较关心怎么把这些字符以Unicode的字节形式表现出来,露出它在内存中的庐山正面目的。这里有个照妖镜:
xxxx.encode/decode('unicode-escape')
输出如下
b'\\u4e2d'还是b'\u4e2d,一个斜杠貌似没影响。同时可以发现在shell窗口中,直接输'\u4e2d'和输入b'\u4e2d'.decode('unicode-escape')是相同的,都会打印出汉字‘中’,反而是'\u4e2d'.decode('unicode-escape')会报错。说明说明Python3不仅支持Unicode,而且一个‘\uxxxx’格式的Unicode字符可被辨识且被等价于str类型。
如果我们知道一个Unicode字节码,怎么变成UTF-8的字节码呢。懂了以上这些,现在我们就有思路了,先decode,再encode。代码如下:
xxx.decode('unicode-escape').encode()
测试如下:
可以看到最后输出的UTF-8字节与上面的相同。尝试成功。所以其他的编码之间的转换,大概也是如此。
最后的扩展
还记得刚刚那个ord吗。时代变迁,老大哥ASCII被人合并,但ord还是有用武之地。试试ord('中'),输出结果是20013。20013是什么呢,我们再试试hex(ord('中')),输出结果是'0x4e2d',也就是20013是我们在上文见面了无数次的x4e2d的十进制值。这里说下hex,是用来转换成十六进制的函数,学过单片机的人对hex肯定不会陌生。
最后的扩展,在网上看到的他人的问题。我们写下类似于'\u4e2d'的字符,Python3知道我们想表达什么。但是让Python读取某个文件的时候出现了'\u4e2d',是不是计算机就不认识它了呢?后来下文有人给出了答案。如下:
import codecs
file = codecs.open( "a.txt", "r", "unicode-escape" )
u = file.read()
print(u)
㈦ python的编码格式
python的源代码通常使用UTF-8编码保存
执行时如果没有其他编码提示,Python将默认使用ASCII作为标准编码
㈧ python unicode编码
python unicode编码:
下面的代码创建了一个Unicode字符串,用UTF-8编码器将它编码,然后写入到一个文件中去,接着把数据从文件中读回来,解码成Unicode字符串对象,最后,打印出Unicode字符串,用以确认程序正确地运行。
在Linux中编写,在VIM中输入如下代码,保存为uniFile.py
#/home/xiaopeng/python/code/uniFile.py
'''
:Writes
aUnicodestringtoafileinutf-8andreadsitbackin
'''
CODEC='utf-8'编码方式
FILE='unicode.txt'要存的文件名
hello_out=u"Helloworld "创建了一个Unicode格式的字符串
bytes_out=hello_out.encode(CODEC)用UTF-8编码
f=open(FILE,'w')
f.write(bytes_out)写入指定文件中
f.close()
f=open(FILE,'r')
bytes_in=f.read()读取
f.close()
hello_in=bytes_in.decode(CODEC)解码
printhello_in打印
在终端中输入:python uniFile.py
结果打印出 Hello world
然后在python目录下会发现多了一个名为unicode.txt的文件,用cat命令查看一下,发现里面的内容和打印的结果一样.
把Unicode应用到实际中注意一下四点:
1程序中出现字符串时一定要加一个前缀u
2不要用str()函数,用Unicode()代替
3 不要用过时的string模块。如果传给它非ASCII码,它会把一切搞砸。
4 不到必须时不要在你的程序里编解码Unicode字符,只在你要写入文件或者数据库或者网络时,才调用encode()函数和decode()函数。
㈨ python2.7.x的字符串编码到底什么鬼
一直以来我其实一直对python的编码弄得非常晕,能正常编码,也能处理一些情况。但是始终不明白有些问题究竟为何出,原因是什么,为什么要这样用。
今天晚上正好好好研究了一番解答了自己心中的困惑。
Q:python2.7.x里面的中文表示到底是什么鬼?
A:直接来看看
In [23]: x = '好不好喝都要喝'
In [24]: x
Out[24]: '\xe5\xa5\xbd\xe4\xb8\x8d\xe5\xa5\xbd\xe5\x96\x9d\xe9\x83\xbd\xe8\xa6\x81\xe5\x96\x9d'
这个x打印值相信熟悉编码的盆友都知道,这是utf-8编码。也就是说python2.7.x 在默认情况下将中文默认转到了utf-8编码。
这里type(x)得到结果是str
Q:python2.7.x里的unicode究竟什么鬼?
A:还是通过例子来看看
In [16]: x = u'好不好喝就很好喝'
In [17]: type(x)
Out[17]: unicode
在2.7.x在中,u写在字符串前面将会将一个字符串转成unicode对象。
Q:python2.7.x中unicode可以和str相加吗?
A:还是来看例子
In [62]: z = '好不好喝'
In [63]: x = u'好不好喝都要喝'
In [64]: z+x
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-64-f964ff206363> in <mole>()
----> 1 z+x
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
熟悉的报错,可见在python2.7.x中,unicode中文和utf8中文是不能相加的因为是不同类型。
Q:那么英文字符串可以相加吗?
A:可以。具体就不掩饰了大家可以自己试试。而且最终得到的结果会被转成全unicode
这两个库在对无论utf8还是unicode对象进行中文编码的时候,都会将内容转成unicode再编码。最后你拿到结果decode之后就变成了unicode对象,想要再拿到utf8对象,就需要再encode一次才可以了。
一不注意就踩坑。
㈩ Python 编码解释
def (pattern):
''' pattern中各个字符的末次出现位置 '''
map = { } # 构建空字典
# 从后向前遍历pattern中的各个字符
for i in range(len(pattern)-1, -1, -1):
c = pattern[i]
if c not in map: # 若字符未在map中登记过
map[c] = i 记录该字符的位置
return map # 返回位置记录
# 该函数等价于:
dict([(c,i) for i,c in enumerate(list(pattern))])
def match(pattern, text):
matches = []
m = len(text) # 文本长度
n = len(pattern) # 检查内容长度
rightMostIndexes = (pattern) # 检查内容的各字符末位位置
alignedAt = 0 # 偏移位置从0开始
while alignedAt + (n - 1) < m:
for indexInPattern in range(n-1, -1, -1):
# 从后向前按检查内容设定各检查位置
indexInText = alignedAt + indexInPattern
# 若检查位置超越文本长度则退出循环
if indexInText >= m:
break
x = text[indexInText] # 文本中检查位置的字符
y = pattern[indexInPattern] # 检查内容中检查位置的字符
if x != y:
r = rightMostIndexes.get(x) # 从检查内容中找到该字符最后位置
if x not in rightMostIndexes: # 若x不在检查内容中, 对其位置后移一位
alignedAt = indexInText + 1
else: # 后移x字符出现的位置
shift = indexInText - (alignedAt + r)
alignedAt += (shift > 0 and shift or alignedAt + 1)
break
elif indexInPattern == 0: # 相符则添加到matches中, 对齐位置后移1位
matches.append(alignedAt)
alignedAt += 1
return matches