前言

这一次我们分析一下Python的字符串,首先字符串是一个变长对象,因为不同长度的字符串所占的内存是不一样的;但同时字符串又是一个不可变对象,因为一旦创建就不可以再修改了。

而Python中的字符串是通过unicode来表示的,在底层对应的结构体是PyUnicodeObject。不过话说回来,为什么需要unicode呢?

首先计算机存储的基本单位是字节,由8个比特位组成,由于英文字母算上大小写只有52个,再加上若干字符,数量不会超过256个,因此一个字节完全可以表示。但是随着计算机的普及,越来越多的非英文字符出现,导致一个字节已经无法表示了。所以只能曲线救国,对于一个字节无法表示的字符,使用多个字节表示

但是这样会出现两个问题:

  • 因为每个国家都有自己的字符编码,所以不支持多国语言,例如中文的编码不可以包含日文,否则就会造成乱码;
  • 没有统一标准,例如中文有GB2312、GBK、GB18030等多个标准;

到这里我们先不继续往下深入,我们先来理清楚一些概念。

字符集和字符编码

估计有很多小伙伴搞不清这两者的区别,我们先来解释一下所谓的字符集和字符编码是怎么一回事?

字符集:系统支持的所有字符组成的集合,像ASCII、GB2312、Big5、unicode都属于字符集。只不过不同的字符集所能容纳的字符个数不同,比如ASCII字符集中不包含中文,unicode则可以容纳世界上的所有字符;

字符编码:负责将每个字符转换成一个或多个计算机可以接受的具体数字,该数字可以理解为编号,因此字符编码维护了字符和编号之间的对应关系。而编码也分为多种,比如ascii、gbk、utf-8等等,字符编码不同,那么字符转换之后的编号也不同,当然能转化的字符种类也不同。比如ASCII这种字符编码,它就只能转换ASCII字符。

当然,ASCII比较特殊,它既是字符集、也是字符编码。并且不管采用什么编码,ASCII字符对应的编号永远是相同的。

将字符串中的每一个字符转成对应的编号,那么得到的就是字节序列(bytes对象),因为计算机存储和网络通讯的基本单位都是字节,所以字符串必须以字节序列的形式进行存储或传输。

因此字符串和字节序列在某种程度上是很相似的,字符串按照指定的编码进行encode即可得到字节序列,也就是将每个字符都转成对应的编号;字节序列按照相同的编码decode即可得到字符串,也就是根据编号找到对应的字符。

比如我们写了一段文本,然后在存储的时候必须先进行编码,也就是将每一个字符都转成一个或多个系统可以接受的数字、即对应的编号之后,才可以进行存储。

s = "你好"
# 编码之后就是一串数字
print(s.encode("gbk"))  # b'\xc4\xe3\xba\xc3'

假设文本中只有你好二字,在存储的时候采用gbk进行编码,那么在读取的时候也必须使用gbk进行解码,否则的话就会无法解析而报错。因为字符编码不同,字符对应的编号也不同。

再比如每个国家都有自己的字符编码,你在日本的一台计算机上写好的文件拿到中国的计算机上打开,很有可能出现乱码。因为字符编码不同,字符和编号之间的对应关系也不同,采用不同的字符编码进行解析肯定会出问题。

但我们说,对于ASCII字符来说,由于不管采用哪一种编码,它们得到的编号都是固定的。所以编码对于ASCII字符来说,没有任何影响。

s = "abc"
print(s.encode("gbk"))  # b'abc'
print(s.encode("gbk").decode("utf-8"))  # abc

# 但如果是非ASCII字符,就不行了
try:
    s = "你好"
    s.encode("gbk").decode("utf-8")
except UnicodeError as e:
    # 报错了,无法解析
    print(e)  
    # 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte

这里我们再回忆一下bytes对象,我们创建的时候可以采用字面量的方式,比如 b"abc",但是 b"憨"却不可以。原因就是憨这个字符不是ASCII字符,那么采用不同的字符编码,其对应的编号是不同的,而这种方式Python又不知道我们使用哪一种编码,所以不允许这么做,而是需要通过"憨".encode的方式手动指定字符编码。

但是对于 ASCII 字符而言,不管采用哪一种字符编码,得到的编号都是一样的, 所以Python针对ASCII字符则允许这种做法,比如b"abc"。并且我们看到,对于汉字来说,在编码之后会对应多个编号,而每个编号占1字节,因此不同的字符所占的大小可能不同。

小结

以上就是字符集和字符编码,字符集就是字符组成的集合,不同字符集所能容纳的字符数量是有限的。字符编码是将字符转成对应的编号,比如将一个字符串中的所有字符都转成对应的编号之后,就得到了字节序列。

当然和字符集一样,字符编码能转换的字符种类也是有限的,像汉字我们可以使用 gbk 编码、utf-8 编码,但是不能使用 ascii 编码。

到此这篇关于Python字符集和字符编码详情的文章就介绍到这了,更多相关Python字符编码内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Python字符集和字符编码详情的更多相关文章

  1. Html5 canvas实现粒子时钟的示例代码

    这篇文章主要介绍了Html5 canvas实现粒子时钟的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. 在Xcode4中,你可以更改用于显示隐形字符的字符吗?

    我更喜欢VisualStudio显示隐形的方式……

  3. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  4. ios – 应用程序商店描述特殊字符

    是不是可以在AppStore描述中使用像星星这样的特殊字符了?我得到这个错误:描述不得包含标记语言.说明不得包含以下字符:★提前致谢:)解决方法仍然允许一些unicode字符.以下字符已经过测试并仍然有效:◆√至于现在他们工作正常,但苹果可以随时再次改变条件.

  5. ios – 将数组中的字符转换为整数

    即使我搜索了文档,我似乎无法弄清楚如何做到这一点.我试图弄清楚如何将数组中索引处的字符转换为整数.例如,假设我有一个名为“容器”的字符数组,我无法弄清楚该怎么做:谢谢您的帮助!解决方法Swift并不容易在原始和类型表示之间进行转换.这是一个在此期间应该有所帮助的扩展:这使您可以非常接近您想要的:对于遇到此问题的任何工程师,请参阅rdar://17494834

  6. ios – 创建一个包含n个空格或其他重复字符的字符串

    我想使用Swift使用n个空格进行字符串,但不使用for循环或手动如下所示:解决方法String已经有一个repeating:count:initializer就像Array(和其他采用RangeReplaceableIndexable协议的集合):所以你可以打电话:请注意,重复的参数是一个字符串,而不仅仅是一个字符,因此您可以重复整个序列:编辑:更改为Swift3语法,并删除了关于Swift1类

  7. ios – 如何使用Unicode十六进制值(UTF-16)在Swift中表达字符串

    我想在Swift中使用十六进制值编写一个Unicode字符串.我已经阅读了字符串和字符的documentation,所以我知道我可以使用特殊的Unicode字符直接在字符串如下:版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  8. iOS设备UDID是否区分大小写?

    这是关于将设备添加到供应门户以进行临时测试.客户端向我发送了一个带有大写字符的UDID,我愚蠢地添加了这些字符而没有检查.无线部署不起作用,我想知道这是否可能是原因,但我想在使用我的100个分配之一之前先检查.解决方法是的,UDID区分大小写.如果它不是数字,您可以浏览所有字符并将它们转换为小写字符.

  9. ios – 在NSString中查找俄语字符

    我必须检查Nsstring中是否存在俄语字符.我正在使用以下代码:但它总是返回FALSE.任何人都可以告诉我我的代码有什么问题吗?谢谢解决方法目前,您的条件检查字符串中不存在非俄语字符,而不是字符串中存在西里尔字符.对于完全由拉丁字母1中没有等效字符的西里尔字符组成的字符串,您的代码将返回YES.要解决此问题,请删除反转,然后反转检查,如下所示:1您忘记在列表中包含软停止,它看起来像小写字母b,但它不是相同的字符.

  10. ios – 计算Swift String的字节大小

    我正在尝试计算Swift中String的字节大小,但我不知道字符的大小是多少;一个编码的字节数是多少?假设我有一个字符串:让str=“你好,世界”我想将它发送到我的服务器,但我的服务器只接受32字节以下的字符串.我如何控制弦乐的长度?解决方法这一切都取决于字符编码,让我们假设UTF8:请注意,并非所有字符在UTF8中都具有相同的字节大小.如果您的字符串是ASCII,则可以假设每个字符有1个字节.

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部