python与中文的那点事

Posted 盐有点多

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python与中文的那点事相关的知识,希望对你有一定的参考价值。

python与中文的那点事

在学习python的过程中,发现在python2与python3中对中文的处理有所不同,所以这篇文章就来探讨一下这些不同

1. utf-8/gbk/unicode/ASCII

  我们都知道,在计算机内部所有的信息都可以被表示成二进制的字符串,每一个二进制位有1和0两种状态,因此8位的二进制数可以表示256种状态,这也被称为字节(byte),也就是一个字节可以表示可以用来表示256种不同的状态,每一个状态都对应一个符号;上个年代美国制定了一套字符编码,对应英文字母与二进制之间的关系,做了统一的规定。这被称为ASCII,一直沿用至今。
  
  当然设计上存在很多的编码方式,同一个二进制也可以被解释成不同的符号,因此想要打开一个文件就必须要知道它的编码方式,否则用错误的编码方式进行读取,就会产生乱码。所以说如果有一种编码,能适应世界上所有的编码规则,那么就可以解决掉所有的乱码问题。所以Unicode这套编码规则就被设计出来了,Unicode当然是一个很大的合集,可以容纳100多万个符号,每个符号的编码都不一样,但是要注意到的是,Unicode只是一个符号集,他并没有规定这个二进制如何去存储,所以有些字符是用2个字节存储,有的是三个或者四个字节进行存储,甚至更多。那么这样的话就会有一个问题,就是计算机应该如何确定到底是三位字节决定一个符号,还是两字节决定一个符号。这样造成的结果就是会产生多种的Unicode编码方式,也就是说有不同的二进制格式,所以不能进行有效的推广。
  
  随着互联网的普及,需要一种能够统一的编码方式,utf-8就是在互联网上是用最广的一种Unicode实现的方法,其他方法还有UFT-18和UTF-32,不过现在在互联网上基本不是很通用,所以要强调的是UTF-8是Unicode的一种实现方式。UTF-8最大的一个特点就是它是一种变长的编码模式;它可以用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
  
  另外,UTF-8是Unix下的通用编码,可以对汉字进行编码;gbk是win环境下的一种汉字编码格式。所有的UTF-8gbk编码都得通过Unicode编码进行转换,而UTF-8gbk之间不能相互转换,要在Unicode过个场。


  

  在下面代码中:

# -*- coding:utf-8 -*-
s=\'汉字\'
print(s)

  s是一串utf-8编码的汉字,在print的时候,先把utf-8转化成unicode再输出成正产显示的汉字。

2.各种编码之间的转换

  python中有两个很好用的函数decode()encode()
  decode(\'utf-8\') 是从utf-8编码转换成unicode编码,当然括号里也可以写\'gbk\'。
  encode(\'gbk\') 是将unicode编码编译成gbk编码,当然括号里也可以写\'utf-8\'。
假如我知道一串编码是用gbk编写的,怎么转成utf-8呢?

s.decode(\'utf-8\').encode(\'gbk\')

  那么这样就有一个有意思的小问题,如何看一个汉字分别用utf-8和gbk编码所用的位数,我们用代码演示一下:

#python3 中可以直接进行编码
>>> len("测试代码".encode("utf-8"))
12
>>> len("测试代码".encode("gbk"))
8
#因为在Python3中默认就是unicode编码

#python2中需要先decode 一次
>>> len("测试代码".decode("utf-8").encode("utf-8"))
12
>>> len("测试代码".decode("utf-8").encode("gbk"))
8

Python3.0中默认的编码类型就是Unicode了,在python2.x中默认编码是ascill。

3. 统计字符串中数字,字母,汉字的个数

#re模块,实现正则匹配
import re

str_test = \'asdfghjkl123456测试代码\'
num_regex = re.compile(r\'[0-9]\')
alphabet_regex = re.compile(r\'[a-zA-z]\')
chzn_regex = re.compile(r\'[\\u4E00-\\u9FA5]\')

print(\'输入字符串:\',str_test)
#findall获取字符串中所有匹配的字符
num_list = num_regex.findall(str_test)
print(\'包含的数字:\',num_list)
alphabet_list = alphabet_regex.findall(str_test)
print(\'包含的字母:\',alphabet_list)
chzn_list = chzn_regex.findall(str_test)
print(\'包含的汉字:\',chzn_list)
print(\'数字个数:\',len(num_list))
print(\'字母个数:\',len(alphabet_list))
print(\'汉字个数:\',len(chzn_list))

输出结果:

输入字符串: asdfghjkl123456测试代码
包含的数字: [\'1\', \'2\', \'3\', \'4\', \'5\', \'6\']
包含的字母: [\'a\', \'s\', \'d\', \'f\', \'g\', \'h\', \'j\', \'k\', \'l\']
包含的汉字: [\'测\', \'试\', \'代\', \'码\']
数字个数: 6
字母个数: 9
汉字个数: 4

以上是关于python与中文的那点事的主要内容,如果未能解决你的问题,请参考以下文章

python pip安装的那点事

python pip安装的那点事

Python爬虫之urllib模拟登录及cookie的那点事

UIScrollview 与 Autolayout 的那点事

与oracle 有关的那点事

与oracle 有关的那点事