中文编码与处理

2021-11-08 作者: admin 浏览: 278 次

摘要: 中文编码与处理¶Python中的中文是个很头痛的问题,Python2和Python3都会出现,而且py2中出现的概率要大些。 接下来我们来讲讲Python中如何处理中文问题。 中文字符串¶Python中默认的编码格式是 ASCII 格式,在没修改编码格...

中文编码与处理

Python中的中文是个很头痛的问题,Python2和Python3都会出现,而且py2中出现的概率要大些。 接下来我们来讲讲Python中如何处理中文问题。

中文字符串

Python中默认的编码格式是 ASCII 格式,在没修改编码格式时无法正确打印汉字,所以在读取中文时会报错。

解决方法为只要在文件开头加入 # -*- coding: UTF-8 -*- 或者 # coding=utf-8 就行了

注意:# coding=utf-8= 号两边不要空格。

In [1]:
# -*- coding: UTF-8 -*-
# coding=utf-8

Python3.X 源码文件默认使用utf-8编码,所以可以正常解析中文,无需指定 UTF-8 编码。

In [2]:
'你好!我是Herry~'
Out[2]:
'你好!我是Herry~'

python3中str默认为Unicode的编码格式。python2中str默认为bytes类型的编码格式。Unicode是一32位编码格式,不适合用来传输和存储,所以必须转换成utf-8,gbk等等。

所以在Python3中必须将str类型转换成bytes类型的。

在Python中使用encode的方式可以进行字符的编码。

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。

encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。

因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码

In [3]:
a = "中国"
a.encode("utf-8")
Out[3]:
b'\xe4\xb8\xad\xe5\x9b\xbd'
In [4]:
a.encode("gbk")
Out[4]:
b'\xd6\xd0\xb9\xfa'

Python中str类型转bytes类型,相当与Unicode转gbk,utf-8等类型。

b'代表字符编码格式为bytes。

utf-8默认24位占3个8位16进制数。

gbk中国编码默认占16位2个8位16进制数字。

正则表达式中文处理

已知字符串a_str中掺有中文和其它字符,使用正则表达式提取出来所有中文的方法有多种,下面依次介绍。

使用ASCII编码

利用 去同存异 的方法

使用正则表达式: \w+, re.A即指ASCII编码, 可匹配除中文以外的单词字符, 得到新列表。首先将字符串按照标点符号分离,形成新的字符串序列a_list

In [5]:
a_str = '开心qwq,哈哈,123.一二三'
import re
a_list = re.split(",|。|?|,|\.",a_str)
a_list
Out[5]:
['开心qwq', '哈哈', '123', '一二三']

使用re.findall方法匹配原字符串a_str中数字和字母下划线的多个字符,形成新的序列res

In [6]:
res = re.findall(r'\w+', a_str, re.A)  
res
Out[6]:
['qwq', '123']

a_list中的非中文序列res移除,获得含有中文的字符串序列。这种方法只适配于可以被分割成纯中英文字符串的状况。

In [7]:
new_list = []
for i in a_list:
    if i not in res:
        new_list.append(i)
new_list
Out[7]:
['开心qwq', '哈哈', '一二三']

汉字的Unicode码表

正则表达式: [\u4e00-\u9fa5], 匹配汉字。依据汉字的Unicode码表: 从u4e00~u9fa5, 即代表了符合汉字GB18030规范的字符集

In [8]:
a_list = re.findall(r'[\u4e00-\u9fa5]', a_str)
a_list
Out[8]:
['开', '心', '哈', '哈', '一', '二', '三']

几个主要非英文语系字符范围:

2E80~33FFh:中日韩符号区。收容康熙字典部首、中日韩辅助部首、注音符号、日本假名、韩文音符,中日韩的符号、标点、带圈或带括符文数字、月份,以及日本的假名组合、单位、年号、月份、日期、时间等。

3400~4DFFh:中日韩认同表意文字扩充A区,总计收容6,582个中日韩汉字。

4E00~9FFFh:中日韩认同表意文字区,总计收容20,902个中日韩汉字。

A000~A4FFh:彝族文字区,收容中国南方彝族文字和字根。

AC00~D7FFh:韩文拼音组合字区,收容以韩文音符拼成的文字。

F900~FAFFh:中日韩兼容表意文字区,总计收容302个中日韩汉字。

FB00~FFFDh:文字表现形式区,收容组合拉丁文字、希伯来文、阿拉伯文、中日韩直式标点、小符号、半角符号、全角

In [9]:
a_list = re.findall(r'[\u4e00-\u9fa5]', a_str)
a_list
Out[9]:
['开', '心', '哈', '哈', '一', '二', '三']

非ASCII码字符(双字节字符)

利用汉字为: 双字节字符的原理。

正则表达式: [^\x00-\xff], 只匹配非ASCII码字符(也称双字节字符)。

In [10]:
a_list = re.findall(r'[^\x00-\xff]', a_str)
a_list
Out[10]:
['开', '心', '哈', '哈', ',', '一', '二', '三']
In [ ]:
 
  • 1   scikit-learn的简单线性回归
  • 1   计算相关系数(R语言)
  • 1   遥感模型:计算NDVI指数