一、python2的字符串类型

在python2中,字符串一般有两种类型,unicode和str。(python3中是Unicode类型)

str类型,字节码类型,根据某种编码把字符串转成对应的字节,一个字符根据不同的编码规则对应不同的字节数。GBK编码一个字符对应两个字节。

unicode类型,则是用unicode编码的字符串,一个字符对应两个字节。

直接赋值字符串,类型为str,str为字节串,会按照开头的encoding来编码成对应的字节。

赋值的时候在字符串前面加个u,类型则为unicode,直接按照unicode编码成两个字节。

# coding=utf-8
s1 = "字节串"
print(type(s1)) #输出 <type 'str'>,按照开头的encoding来编码成相应的字节
print(len(s1)) #输出9,因为按utf8编码,一个汉字占3个字节,3个字就占9个字节s2 = u"万国码"
print(type(s2)) #输出 <type 'unicode'>,用unicode编码,2个字节1个字符
print(len(s2)) #输出3,unicode用字符个数来算长度,从这个角度上看,unicode才是真正意义上的字符串类型
E:\PycharmProjects\LEDdisplay2\venv\Scripts\python.exe E:/PycharmProjects/LEDdisplay2/1.py
<type 'str'>
9
<type 'unicode'>
3Process finished with exit code 0

再举个例子,比如要从一个文件中找出所有后两位是’字符’的词语,在进行判断的时候:

# coding=utf-8
s = '中文字符'
s[-2:] == '字符‘
# 返回false,本以为相等但在python2中是不相等的
# 这里的”字符是用开头的encoding声明解释的,我开头用的是utf8,汉字占3个字节,所以“字符”占了6个字节),而s[-2:]取的是最后两个”双字节“,所以不相同。s = u'中文字符'
s[-2:] == u'字符’
# 加u强制转换成unicode
# 返回true,这也是为什么说unicode是真正意义上的字符串类型。因为使用的是unicode,”字符“占的是两个”双字节“,一个"双字节“一个字。

对于经常处理中文字符串的人,统一用unicode(加u强制转换成unicode)就可以避免这个坑了。

虽然有些字符串处理函数用str也可以,应该是函数里面帮你处理了编码问题。

二、python3的字符串类型

python3中,字符串是以Unicode编码的,是str类型。

如果要在网络上传输,或者保存到磁盘,就需要把str变为以字节为单位的bytes。python3中对bytes类型的数据用带b前缀的单引号或者双引号表示。

以Unicode表示的str通过encode()方法可以编码为指定的bytes。反过来,从网络或磁盘上读取的字节流,即bytes,要把bytes变为str,通过decode()方法。

>>> "ABC".encode("utf-8")
b'ABC'
>>> "中文".encode("utf-8")
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
# 纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。
# 含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错
# 因为python3中字符串类型是Unicode编码的,所以不需要先decode成Unicode,直接encode成指定编码的bytes

反过来


>>> b'ABC'.decode("utf-8")
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode("utf-8")
'中文'
>>>

三、python3字符函数举例一二

len()函数,str类型字符串调用时,计算的是字符数,bytes类型调用时,计算的是字节数

>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8'))
6
# 1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节

ord()函数,获取单个字符的整数表示

chr()函数,把单个字符的整数转换为对应的字符

C:\Users\xxx>python3
Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.>>> ord("A")
65
>>> ord("中")
20013
>>> chr(65)
'A'
>>> chr(25991)
'文'
>>>

chardet.detect(str),查看字符串的编码格式
detect()函数接受一个参数,一个非unicode字符串
它返回一个字典,其中包含自动检测到的字符编码和从0到1的可信度级别。encoding:表示字符编码方式;confidence:表示可信度; language:语言

# encoding: utf-8
import chardet
s = "中文".encode("utf-8")
print(chardet.detect(s))
D:\SoftInstall\Python\Python38\python3.exe E:/PycharmProjects/displayPY3/1.py
{'encoding': 'utf-8', 'confidence': 0.7525, 'language': ''}Process finished with exit code 0

检测出的编码是ascii,confidence字段表示检测的概率是0.7525(即75.25%)

python的字符串类型相关推荐

  1. python json字符串类型的value换行方案

    按照标准json语法,字符串类型的value是不能换行写的. 例如,以下是错误的写法 {"key":"helloworld" } 但是遇到了需要在json中写代 ...

  2. python定义字符串类型_Python数据类型之字符串

    1. Python字符串的创建 字符串是Python中最常见的数据类型,通常使用单引号或双引号来定义一个字符串,如下: str = "我是字符串" str1 = '我也是字符串' ...

  3. python中字符串类型的encode()方法_第五章 Python字符串常用方法详解

    5.1 Python字符串拼接(包含字符串拼接数字) 在 Python中拼接(连接)字符串很简单,可以直接将两个字符串紧挨着写在一起,具体格式为: strname = "str1" ...

  4. python:判断字符串类型方法

    str对象包括如下用于判断字符串类型的方法: str.isalnum():是否全为字母或数字 str.isalpha():是否全为字母 str.isdecimal():是否只含十进制数字符号 str. ...

  5. python 测试字符串类型_【教程】如何用Python中的chardet去检测字符编码类型

    [背景] 之前已经使用过chardet了,也算用了不少次了. 之前也写过和chardet相关的: 但是没写教程,举例说明如何使用. 现在去举例解释解释. [python示例代码演示如何用chardet ...

  6. python测试字符串类型的函数_python-02 数据类型 字符串str

    字符串str 一.字符串定义 概念:字符串是有序的 不可修改的,元素以引号包围的序列 引号类型:''单引号 ""双引号 " ""三引号 '''三单引号 ...

  7. python的字符串类型_python如何判断某变量是否为字符串类型

    isinstance是Python中的一个内建函数 语法:isinstance(object, classinfo) 如果参数object是classinfo的实例,或者object是classinf ...

  8. 【Python】字符串类型及操作求三位水仙花数

    "水仙花数"是指一个三位整数,其各位数字的3次方和等于该数本身.‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪例如:ABC是一个"3位水仙花数&quo ...

  9. python实现字符串类型 str 转换为 list 类型(unicode 转换为 list)

    在debug的时候发现了 type() 检测一个变量的时候,发现类型是unicode,然后自己需要的是list类型. 字符串如下: 但是不能用list()函数直接转换,因为直接转换就会使每一个字符都成 ...

最新文章

  1. 《黑客秘笈——渗透测试实用指南(第2版)》目录—导读
  2. com.tadu.android中文,塔读文学(com.tadu.android) - 6.68 - 应用 - 酷安
  3. recyclerview 滚动冲突_如何处理手势冲突 | 手势导航连载 (三)
  4. 没事试试50mm1.4
  5. 【DIY】DIYarduino温湿度计视频图文教程
  6. 一直在构建工作空间_基于用户场景构建的建筑工程弱电设计工作设想
  7. QDir类cleanPath函数用法
  8. 2560x1600分辨率高吗_做设计还弄不清分辨率和像素之间的关系,来了解下他们是怎么换算...
  9. qt添加资源文件后编译失败,提示Qt:Error:No rule to make target ’ … /…/??.png’,needed by ‘debug/qrc_qrc.cpp’ stop
  10. linux 编辑文件乱码,Linux 下 vim 编辑文件,解决中文乱码,设置Tab键空格数
  11. 通用知识图谱的构建及在QQ浏览器的应用实践
  12. Qt5.4生成安装包过程
  13. 如何使用BetterZip mac版将大文件分卷压缩
  14. 使用AjaxPro实现ajax效果
  15. ofo现在还有退路吗?
  16. 超全深度学习细粒度图像分析:项目、综述、教程一网打尽
  17. 引入阿里icon库的方法(font-class 引用)
  18. 直播带货系统的六大热门功能模块概述
  19. 电话拨键号码(DTMF信号)识别
  20. Wipro任命Thierry Delaporte为首席执行官兼董事总经理

热门文章

  1. latex子图跨页处理和编号问题
  2. 将网站变成灰色,黑白色,兼容IE,谷歌CSS滤镜
  3. regex和集合(collection)
  4. ARM V8A体系结构-第十二章 The Memory Management Unit
  5. vue lrz.js
  6. 太空 5G 在启动板上
  7. 领导问结婚情况什么意思_领导者如何在没有共识的情况下前进
  8. 第四次作业 简易计算器
  9. eric6, git-en_US 无法加载警示
  10. Uncaught TypeError: $(...).Validform is not a function