python与中文的那点事

目录

  • python与中文的那点事

    • 1. utf-8/gbk/unicode/ASCII
    • 2.各种编码之间的转换
    • 3. 统计字符串中数字,字母,汉字的个数

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

原文地址:https://www.cnblogs.com/huizhipeng/p/10089848.html

时间: 2024-08-10 14:57:53

python与中文的那点事的相关文章

Python读取中文txt文件错误:UnicodeEncodeError: 'gbk' codec can't encode character

1 with open(file,'r') as f: 2 line=f.readline() 3 i=1 4 while line: 5 line=line.decode('utf-8') 6 print str(i)+": "+line7 line=f.readline() 8 i=i+1 用以上代码读取一个包含中文的txt文件时,在正确地读取并打印了六百多行之后,print str(i)+": "+line这一行报错: UnicodeEncodeError:

Python中中文路径处理问题的研究

a = '你' 为 str 对象 a = u'你' 为 unicode 对象 1. >>> print 'u'  + '你' >>> u浣 输出乱码 2. >>> print 'u'  + u'你' >>> u你 正常 3. >>> print 'u你' >>> u浣 输出乱码 4. >>> print 'u你' + 'u' >>> u浣爑 输出乱码 5. >

Sublime Text 2 运行 Python 脚本中文路径解决方法

在 SublimeText 中直接运行 Python 脚本,出现以下报错提示: Running python -u C:\Documents and Settings\Administrator\桌面\furl.py Traceback (most recent call last): File ".\sublime_plugin.py", line 340, in run_ return self.run(**args) File ".\exec.py", lin

{转}Python IDLE中文乱码

http://hi.baidu.com/yobin/item/166e3a46537781d3c1a59257 乱码原因:因为你的文件声明为utf-8,并且也应该是用utf-8的编码保存的源文件.但是windows的本地默认编码是cp936,也就是gbk编码,所以在控制台直接打印utf-8的字符串当然是乱码了. 解决方法:在控制台打印的地方用一个转码就ok了,打印的时候这么写:print myname.decode('UTF-8').encode('GBK') 比较通用的方法应该是:import

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

这篇博客根据中文自然语言预处理的步骤分成几个板块.以做LDA实验为例,在处理数据之前,会写一个类似于实验报告的东西,用来指导做实验,OK,举例: 一,实验数据预处理(python,结巴分词)1.对于爬取的评论做分词和词性标注处理(mac-result.txt)2.对于结果只用公版的停用词表去停用词,不进行人工筛选(mac-result1.txt)3.保留:名词,名词短语(两者为评论描述主题) 形容词,动词,动词短语(对主题的描述)以及其他可能有实意的词   去除:副词,标点,拟声词等无实意词包括

python 读取中文CSV 'gbk' codec can't decode bytes in position 2-3:illegal multibyte sequence

读取中文的文档如Excel,CSV文件,需要中文编码 如gbk 解码才能转Unicode:然而 数据混合类型,读CSV文件就会出错,经管Excel正常. UnicodeDecodeError :'gbk' codec can't decode bytes in position 2-3:illegal multibyte sequence意思是:将一个字符串,通过gbk的方式,去解码,想要获得Unicode字符串,结果出错了 解决方法:处理的字符的确是gb2312,但是其中夹杂的部分特殊字符,是

Python解决中文乱码问题

在Python中内部所有编码都是Unicode,Unicode属于中转码,一般来说,是先把乱码转化为中转码,再转化为我 们需要的编码,转换过程为decode -> unicode -> encode. #coding:utf-8 #-*- coding:utf-8 -*- import sys print sys.getdefaultencoding() print '中国' f = open('Hello.txt') data = f.read() f.close() print data.

python MySQLdb中文乱码

Python操作MySQL需要安装Python-MySQL可以从网上搜索一下,和一般的Python包一样安装 安装好之后,模块名字叫做MySQLdb ,在Window和Linux环境下都可以使用,试验了一下挺好用,不过又发现了烦人的乱麻问题,最后用了几个办法,解决了! 我用了下面几个措施,保证MySQL的输出没有乱麻:    1 Python文件设置编码 utf-8 (文件前面加上 #encoding=utf-8)    2 MySQL数据库charset=utf-8     3 Python连

【随笔记录】python 处理中文时出现的错误'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)" 解决方法

python xml处理中文时出现的错误,记录一下,以免忘记 "UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)" 解决办法,在该python文件的前面加上如下几句,问题得到解决. import sys default_encoding = 'utf-8' if sys.getdefaultencoding() != default_enco