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与中文的那点事的更多相关文章

  1. python处理中文

    python 清洗中文文件 需要用到的两个链接: 1,unicode编码转换器 http://www.bangnishouji.com/tools/chtounicode.html 2,Python匹 ...

  2. python matplotlib 中文显示参数设置

    python matplotlib 中文显示参数设置 方法一:每次编写代码时进行参数设置 #coding:utf-8import matplotlib.pyplot as pltplt.rcParam ...

  3. python截取中文字符串

    python的中文处理还是比较麻烦的,utf-8的字符串的长度是1-6个字符,一不小心就会从中截断,出现所谓的乱码.下面这个函数提供了,从一段utf-8编码的字符串中,截取固定长度的字串.ord(ch ...

  4. python读取中文文件编码问题

    python 读取中文文件后,作为参数使用,经常会遇到乱码或者报错asii错误等. 我们需要对中文进行decode('gbk') 如我有一个data.txt文件有如下内容: 百度 谷歌 现在想读取文件 ...

  5. 用python做中文自然语言预处理

    这篇博客根据中文自然语言预处理的步骤分成几个板块.以做LDA实验为例,在处理数据之前,会写一个类似于实验报告的东西,用来指导做实验,OK,举例: 一,实验数据预处理(python,结巴分词)1.对于爬 ...

  6. 【转】Python BeautifulSoup 中文乱码解决方法

    这篇文章主要介绍了Python BeautifulSoup中文乱码问题的2种解决方法,需要的朋友可以参考下 解决方法一: 使用python的BeautifulSoup来抓取网页然后输出网页标题,但是输 ...

  7. python matplotlib 中文显示乱码设置

    python matplotlib 中文显示乱码设置 原因:是matplotlib库中没有中文字体.1 解决方案:1.进入C:\Anaconda64\Lib\site-packages\matplot ...

  8. python爬虫中文乱码解决方法

    python爬虫中文乱码 前几天用python来爬取全国行政区划编码的时候,遇到了中文乱码的问题,折腾了一会儿,才解决.现特记录一下,方便以后查看. 我是用python的requests和bs4库来实 ...

  9. 【292】Python 关于中文字符串的操作

    参考:什么是字符编码? 参考:Unicode 和 UTF-8 有何区别? 参考:python中文decode和encode转码 一.相关说明 Python 中关于字符串的操作只限于英文字母,当进行中文 ...

随机推荐

  1. Fiddler工具使用介绍三

    我们知道Fiddler是位于客户端和服务器之间的代理,它能够记录客户端和服务器之间的所有 HTTP请求,可以针对特定的HTTP请求,分析请求数据.设置断点.调试web应用.修改请求的数据,甚至可以修改 ...

  2. 爬虫:Scrapy5 - 选择器Selectors

    当抓取网页时,常见的任务是从HTML源码中提取数据.现有的一些库可以达到这个目的: BeautifulSoup lxml Scrapy 提取数据有自己的一套机制.它们被称作选择器(seletors), ...

  3. WebForm - 文本框回车事件

    document.getElementById("Pwd").onkeyup = function (e) { ) { fun_Login(); } };

  4. Centos6.7配置Nginx+Tomcat简单整合

    系统环境:Centos 6.7 软件环境:JDK-1.8.0_65.Nginx-1.10.3.Tomcat-8.5.8 文档环境:/opt/app/ 存放软件目录,至于mkdir创建文件就不用再说了 ...

  5. [Fatal Error] :3:13: Open quote is expected for attribute "{1}" associated with an element type "id".

    用DOM解析XML时出现了如下错误: [Fatal Error] :3:13: Open quote is expected for attribute "{1}" associa ...

  6. c++之菱形继承问题

    昨天面试问了菱形继承的问题,回答的稀巴烂,回来赶快好好学习一波!!!!! 菱形继承如下图: 上一段代码: #include<bits/stdc++.h> using namespace s ...

  7. 【从0到1学Web前端】javascript中的ajax对象(一) 分类: JavaScript 2015-06-24 10:18 754人阅读 评论(1) 收藏

    现在最流行的获取后端的(浏览器从服务器)数据的方式就是通过Ajax了吧.今天就来详细的来学习下这个知识吧.如果使用ajax来访问后段的数据,浏览器和浏览器端的js做了那些工作呢?我做了一个图,请大家看 ...

  8. Linux下升级Python到3.5.2版本

    原文出处:https://www.cnblogs.com/tssc/p/7762998.html 本文主要介绍在Linux(CentOS)下将Python的版本升级为3.5.2的方法 众所周知,在20 ...

  9. spec 文件详解

    转自http://blog.sina.com.cn/s/blog_43b39e250100nnu4.html rpm软件包系统的标准分组:/usr/share/doc/rpm-4.3.3/GROUPS ...

  10. 简述serializable和transient关键字作用

    transient的作用及使用方法,官方解释为: Variables may be marked transient to indicate that they are not part of the ...