参考:什么是字符编码?

参考:Unicode 和 UTF-8 有何区别?

参考:python中文decode和encode转码


一、相关说明

Python 中关于字符串的操作只限于英文字母,当进行中文字符的操作的时候就会报错,以下将相关操作方法进行展示。

写在前面:如何获得系统的默认编码 ?

>>> import sys
>>> print sys.getdefaultencoding()
ascii

通过如下代码查询不同的字符串所使用的编码,具体操作详见:用chardet判断字符编码的方法

由此可见英文字符与中文字符用的是不一样的编码,因此需要将中文字符转为 Unicode 编码才能正常的计算了!

>>> import chardet
>>> print chardet.detect("abc")
{'confidence': 1.0, 'language': '', 'encoding': 'ascii'}
>>> print chardet.detect("我是中国人")
{'confidence': 0.9690625, 'language': '', 'encoding': 'utf-8'}
>>> print chardet.detect("abc-我是中国人")
{'confidence': 0.9690625, 'language': '', 'encoding': 'utf-8'}

通过 decode('utf-8') 将中文字符串解码,便可以正常操作,要相对中文字符进行相关操作,涉及到字符串函数的,需要按如下操作。

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

>>> m = "我是中国人"
>>> m
'\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba'
>>> print m
我是中国人
>>> # 为解码前长度为15,utf-8编码
>>> len(m)
15 >>> n = m.decode('utf-8')
>>> n
u'\u6211\u662f\u4e2d\u56fd\u4eba'
>>> print n
我是中国人
>>> # 解码后长度为5,可以正常的操作,Unicode编码
>>> len(n)
5

将 utf-8 与 Unicode 编码转化函数如下:

def decodeChinese( string ):
"将中文 utf-8 编码转为 Unicode 编码"
tmp = string.decode('utf-8')
return tmp def encodeChinese( string ):
"将 Unicode 编码转为 utf-8 编码"
tmp = string.encode('utf-8')
return tmp

二、截取中英文字符串

代码如下:

def cutChinese(string, *se):
"实现汉字截取方法 —— 默认start为开始索引,不写end就是到结尾,否则到end"
start = se[0]
if len(se)>1:
end = se[1]
else:
end = len(string)
tmp = string.decode('utf-8')[start:end].encode('utf-8')
return tmp

调用方法如下:

>>> from win_diy import *
>>> print win.cutChinese("我是一个abc", 2)
一个abc
>>> print win.cutChinese("我是一个abc", 2, 4)
一个
>>> print win.cutChinese("我是一个abc", 2, 5)
一个a
>>> print win.cutChinese("我是一个abc", 2, 6)
一个ab

参考:python截取中文字符串


三、判断变量编码格式

通过 isinstance 函数或 type 函数可以判断字符串类型
通过 chardet.detect 函数可以判断字符串的编码格式

>>> import chardet
>>> a = "abc"
>>> isinstance(a, str)
True
>>> chardet.detect(a)['encoding']
'ascii'
>>> isinstance(a, unicode)
False >>> b = "中国"
>>> isinstance(b, str)
True
>>> chardet.detect(b)['encoding']
'utf-8'
>>> isinstance(b, unicode)
False >>> # 用chardet.detect函数判断Unicode会报错
>>> c = b.decode('utf-8')
>>> isinstance(c, unicode)
True

参考:Python 字符编码判断

【292】Python 关于中文字符串的操作的更多相关文章

  1. python+selenium之字符串切割操作

    python+selenium之字符串切割操作 在Python中自带的一个切割方法split(),这个方法不带参数,就默认按照空格去切割字段,如果带参数,就按照参数去切割. 新建一个python文件, ...

  2. Python 基礎 - 字符串常用操作

    字符串常用操作 今天就介紹一下常用的字符串操作,都是以 Python3撰寫的 首字母變大寫 #!/usr/bin/env python3 # -*- coding:utf-8 -*- name = & ...

  3. python截取中文字符串

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

  4. python中关于字符串的操作

    Python 字符串操作方法大全 python字符串操作实方法大合集,包括了几乎所有常用的python字符串操作,如字符串的替换.删除.截取.复制.连接.比较.查找.分割等,需要的朋友可以参考下 1. ...

  5. python基础学习-字符串常见操作

    字符串常见操作 索引 s = "abcdefg" # 字符串数据,切片后取出的数据都是字符串类型 # 从左至右取值:从0开始 # 从右向左取值:从-1开始 print(" ...

  6. Python中对字符串的操作

    Python字符串的相关操作 1.字符串格式判断 s.isalnum() #所有字符都是数字或者字母 s.isalpha() #所有字符都是字母 s.isdigit() #所有字符都是数字 s.isl ...

  7. python基础之字符串常用操作总结

    字符串的索引 s = 'ABCDLSESRF' # 索引 这两个很简单没什么说的 s1 = s[0] print(s1) # A s2 = s[2] print(s2) # C 切片 s = 'ABC ...

  8. Python文本和字符串常用操作

    ## 字符串分割 line = "This is my love!" fields = line.split(' ') print(fields) # ['This', 'is', ...

  9. 【python 3】 字符串方法操作汇总

    基础数据类型:str 1.1  字符串大小写转换 所有字母大写 : string.upper() 所有字母小写 : string. lower() 第一个单词的第一个字母大写,其他字母小写 :  st ...

随机推荐

  1. 如何发布二次开发后的openfire源码到linux服务器中

    这篇文章是在你已经down了openfire的源码,然后在本地跑起来了,再然后开发了一个自己的插件,想要发布到服务器上.ok这时候出现了一个问题,怎么才能发布到服务器上呢?别急往下看: 1.运行ant ...

  2. 使用BloomFilter布隆过滤器解决缓存击穿、垃圾邮件识别、集合判重

    Bloom Filter是一个占用空间很小.效率很高的随机数据结构,它由一个bit数组和一组Hash算法构成.可用于判断一个元素是否在一个集合中,查询效率很高(1-N,最优能逼近于1). 在很多场景下 ...

  3. Win7系统64位环境下使用Apache——下载mod_jk

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/70313329 本文出自[我是干勾鱼的博客] 之前在几篇文章: Win7系统64位 ...

  4. => 应用在js回调函数中

    => 可以简化以前的回调函数的调用,具体来说: 今后,几乎所有的回调函数都可用箭头函数简化 比如: 1. 所有回调函数都可: 去function改=> 2. 如果函数体只有一句话: 可省略 ...

  5. 你真的对java static了解吗,代码优化可能更加简单

    static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们.因此,s ...

  6. poj 1952 最长公共子序列计数

    看代码就懂了  不解释  3 1 1 1 1 2 2 2 1 1 1 3  第一个3 和最后一个 3 只需要一个就够了,,, #include<iostream> #include< ...

  7. 为什么要使用ORM技术?和 JDBC 有何不一样?

    为什么要使用ORM技术?和 JDBC 有何不一样?        1.繁琐的代码问题:        用JDBC的API编程访问数据库,代码量较大,特别是访问字段较多的表的时候,代码显得繁琐.累赘,容 ...

  8. Robot Framework接口测试(4)

    现在我们已经做好了进行接口测试的必要准备:1.拼接发送的报文:2.发送报文的方法.现在我们实现RF上的接口测试. 我们先对发送的方法进行一下封装: 1.拼接报文方法: #coding : utf-8 ...

  9. Delphi 连接 Paradox

    应用TDataBase控件把DataBase的DriveName设为STANDARD,然后设置DataBase的Params中设置PATH=*.db文件地点目录DEFAULT DRIVER=PARAD ...

  10. 区域存储网络(SAN)与 网络直接存储(NAS)

    随着互联网及网络应用的飞速发展,数据信息存储系统所需处理的数据类型也呈爆炸性增长,这使数据信息存储系统面临前所未有的挑战.附加式网络存储装置(Network Attached Storage,缩写为N ...