[Python学习日记-22] Python 中的字符编码(下)

[Python学习日记-22] Python 中的字符编码(下)

简介

编码的战国时代

Unicode 和 UTF

现代计算机系统通用的字符编码工作方式

简介

        在[Python学习日记-21] Python 中的字符编码(上)中我们讲了字符编码中的 ASCII 码和 GB2312/GBK,本片我们来讲述当时犹如雨后春笋般的编码战国时代和万国码时代,以及 Python 在这时代背景下的一些特性

编码的战国时代

        之前我们讲了 GB2312/GBK 编码,其实这个只是中国的情况,世界上有很多国家在开始使用计算机时也面临该状况,所以很多国家都开发了自己的字符编码以适应本国的国情,包括但不完全的有以下类型:

  • ASCII(美国等使用英语的国家,占1个字节,只支持英文)
  • GB2312/GBK(中国字符,占2个字节,支持6700+汉字,而GBK是GB2312的升级版,支持21000+汉字)
  • Shift-JIS(日本字符)
  • ks_c_5601-1987(韩国编码)
  • TIS-620(泰国编码)

常用编码介绍一览表:

编码制定时间作用所占字节数
ASCII1967年表示英语及西欧语言8bit/1bytes
GB23121980年国家简体中文字符集,兼容 ASCII2bytes
Unicode1991年国际标准组织统一标准字符集2bytes
GBK1995年GB2312 的扩展字符集,支持繁体字,兼容 GB23122bytes
UTF-81992年不定长编码1-3bytes

        各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。例如有一个日本进口的游戏(日本默认使用 Shift-JIS),往自己电脑上一装(中文版的 Windows 字符编码默认是 GBK),就显示乱码了。

        因此极大的阻碍不同国家之间的信息传递,这个乱局最终是联合国出面解决的,于是就诞生了下面要说的 Unicode 和 UTF

Unicode 和 UTF

一、Unicode

         上面讲到,由于各国之间都开发出了自己的字符编码,导致不同国家之间的信息传递有极大的阻碍。所以 Unicode 编码应运而生,Unicode 编码把所有语言都统一到一套编码里,这样就不会再有乱码问题了。Unicode 编码使用2到4个字节,并且已经收录136690个字符,并还在一直不断扩张中。同时 Unicode 编码标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持 Unicode 编码。

特点:

  1. 支持全球所有的语言
  2. 可以跟各种语言的编码自由转换,也就是说,即使你 GBK 编码的文字,想转成 Unicode 编码也很容易

        为何 Unicode 编码需要与其他语言的字符编码相互转换呢?这是个历史问题,以中文编码为例,GB2312 最早是在1980年出现的,而 Unicode 编码是1990年才出现的,那在这十年之间无数的计算机应用开发都是使用 GB2312 来开发的,如果突然间要求所有的计算机应用都使用该编码,那几乎就是要求所有使用 GB2312 来开发的计算机应用推倒重来,这换做你应该也会反对吧;并且 GB 系列编码就像汉语在国内一样,而 Unicode 编码就像国际通用语言英语一样,而我们在国内沟通时基本不需要使用英语吧,所以也没有很强烈的需要要求把 GB 系列编码转换成 Unicode 编码。

        于是联合国为了推广 Unicode 编码还做了以下努力:

  1. 联合国要求全球计算机厂商出厂都支持 Unicode
  2. Unicode 与所有语言编码都做了对应关系(这也是为什么 Unicode 可以与各种语言编码可以自由转换的原因)

        而目前为止大多数的计算机应用都支持 Unicode 编码。下图就是 Unicode 编码跟中文编码的对应关系

二、UTF

        但是新的问题又出现了!如果统一成 Unicode 编码,乱得问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用 Unicode 编码比 ASCII 码的存储空间需要多一倍,由于计算机的内存比较大,并且字符事在内容中表示时也不会特别大,所以内存可以使用 Unicode 编码来处理,但是存储和网络传输时一般数据都会非常多,那么这多的一倍的存储空间将是无法接受的。

        为了解决存储和网络传输的问题,于是出现了 UTF(Unicode Transformation Format),即:对 Unicode 编码进行转换,以便于在存储和网络传输时可以节省空间,UTF 有以下版本:

  • UTF-8(主流):使用1、2、3、4个字节表示所有字符,优先使用1个字符、无法满足则增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个
  • UTF-16:使用2、4个字节表示所有字符,优先使用2个字节,否则使用4个字节表示
  • UTF32:使用4个字节表示所有字符

        总的来说,UTF 是为 Unicode 编码而设计的一种,在存储和传输时节省空间的编码方案。如果你要传输的文本包含大量英文字符,用 UTF-8 编码就能节省空间,ASCII、Unicode、UTF-8之间的对应如下表所示

字符ASCIIUnicodeUTF-8
A0100000100000000 0100000101000001
x01001110 0010110111100100 10111000 10101101

        从上面的表格还可以发现,UTF-8 编码有一个额外的好处,就是 ASCII 码实际上可以被看成是 UTF-8 编码的一部分,所以大量只支持 ASCII 码的历史遗留软件可以在 UTF-8 编码下继续工作。

现代计算机系统通用的字符编码工作方式

        目前我们已经对 ASCII、Unicode 和 UTF-8 有了了解,那我们现在总结一下现代计算机系统通用的字符编码工作方式。

        在计算机内存中,统一使用 Unicode 编码,当需要保存到硬盘或者需要传输的时候,就转换为 UTF-8 编码。例如用记事本编辑的时候,从文件读取的 UTF-8 字符被转换为 Unicode 字符到内存里,编辑完成后,保存的时候再把 Unicode 转换为 UTF-8 保存到文件。如下图所示

        值得一提的还有,如果你的系统编码格式是 UTF-8 编码,而你所写的程序为 GBK 编码,那么也会产生乱码,这是因为 UTF-8 与 GBK 并没有直接关系,之所以他们能转换是因为 Unicode 作为中介,具体如下图所示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1535626.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

18060 删除空格

**思路**: 1. 使用两个指针,一个指向当前字符位置,另一个指向下一个非空格字符应该放置的位置。 2. 遍历字符串,如果当前字符不是空格,则将其移动到目标位置指针处,并递增目标位置指针。 3. 最后在目标位置指针处添加字…

新电脑安装和配置pytorch、anaconda、CUDA、cuDNN、pycharm、OpenCV的过程记录

显卡驱动和CUDA 一、升级显卡驱动到官方最新版 1、打开英伟达官网,输入显卡芯片型号,手动搜索并下载显卡驱动。 NVIDIA 官方驱动 ​ 2、下载完成后安装驱动。 二、确认显卡支持的最高CUDA版本 1、键盘"winR",调出运行输入cmd后…

查询中的算术表达式

需要修改数据显示方式,如执行计算,或者作假定推测,这些都可能用到算术表达式。 一个算术表达式可以包含列名、固定的数字值和算术运算符。 使用算术运算符 示例:查询雇员的年薪,并显示他们的雇员ID,名字…

支付域——聚合支付设计

摘要 聚合支付是支付行业的一项重要创新,通过整合多种支付方式,极大简化了支付流程,提升了交易效率,为商户和消费者提供了更加便捷的支付体验。随着移动支付的普及,聚合支付在未来的支付场景中将继续发挥重要作用&…

bat批量修改文件名

一、bat代码 代码如下,其中csv_file中记录了原来的文件名字和要修改为的新文件名字,folder是img所在的文件路径。 echo off setlocal enabledelayedexpansion set "csv_fileD:\img\1.csv" set "folderD:\img\" for /f "…

Spring Boot母婴商城:打造一站式购物体验

1 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样的大环境让那些止步不前&#…

华为项目管理培训产品总监兼首席架构师刘钊受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 华为项目管理培训产品总监兼首席架构师刘钊先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾,演讲议题为“打造项目管理人才队伍——华为项目经理任职资格和专业认证体系”。大会将于10月…

unity 图片置灰shader

我和chatgpt真强! 在 Unity 编辑器中,右键点击 Assets 文件夹,选择 Create -> Shader -> Unlit Shader。shader代码如下,尽管我看的不是很懂,但确实有用 Shader "Custom/GrayScaleShader" {Properti…

基于 CrewAI 多智能体框架,手把手构建一个自动化写作应用实战

明月皓皓,星河灿烂,中秋佳节,团圆美满。祝大家中秋节快乐!听说台风要来了,也不知道还能不能吃着月饼赏个月? 老牛同学在上文(Agent(智能体)和 MetaGPT,一句话实现整个需求应用代码&a…

【hot100-java】【环形链表】

R8-链表篇 思路: 使用快慢指针,快指针走两步,慢指针走一步。追上,有环。 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* n…

fuaeehfnklae

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

神经网络通俗理解学习笔记(1)

神经网络通俗理解学习笔记(1) 神经网络原理激活函数前向传播和反向传播多层感知机代码实现加载数据网络结构损失函数优化器训练测试保存 回归问题一元线性回归多元线性回归多项式回归 线性回归代码实现数据生成设置超参数初始化参数可视化Pytorch模型实现…

43.哀家要长脑子了!

1.39. 组合总和 - 力扣(LeetCode) 对于这类寻找所有可行解的问题,都可以尝试使用 [搜索回溯] 的方法。以下是朴素不减脂的方法,我昨天吃了个干煸炒面,巨朴素。。。一点都不减脂,但是很好吃~~~ class Solut…

Cisco Catalyst 9000 Series Switches, IOS XE Release 17.15.1 ED

Cisco Catalyst 9000 Series Switches, IOS XE Release 17.15.1 ED 思科 Catalyst 9000 交换产品系列 IOS XE 系统软件 请访问原文链接:https://sysin.org/blog/cisco-catalyst-9000/,查看最新版。原创作品,转载请保留出处。 作者主页&…

双指针的用法以及示例

当然可以!双指针(Two Pointers)是一种常用的算法技巧,特别适用于处理数组或链表等线性数据结构的问题。以下是双指针用法的总结: 双指针用法总结 基本概念: 双指针技术使用两个指针在数据结构上进行遍历&a…

河海大学《2020年+2021年827自动控制原理真题》 (完整版)

本文内容,全部选自自动化考研联盟的:《25届河海大学827自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2020年复试真题 2021年初试真题 Part1:完整版真题 2020年复试真题 2021年…

GEO数据的下载和处理|GEO数据转换为Gene symbol|GEO注释文件提取symbol|查看样本标签|查看GEO数据疾病或正常|生物信息基础

GEO数据的下载和处理|GEO数据转换为Gene symbol|GEO注释文件提取symbol|查看样本标签|查看GEO数据疾病或正常|生物信息基础 数据的下载和处理 首先在GEO数据库中通过GSE ID找到相关数据,然后下载txt文件。 数据读取与处理。 #设置工作路径,也就是你的…

CCS6 软件及仿真器驱动安装

1 CCS6 软件获取 TI 的官网上下载: http://www.ti.com/tools-software/ccs.html 注意 首先 win32 是 CCS 安装包支持 64 位系统,我们电脑也是 64 位系统也是安装的 win32 的安装包,另外 TI 只提供 win32 的安装包,无 win64 的安装包。 2 CCS6 软件安装 CCS如果获取提供的…

获取无人机经纬度是否在指定禁飞区内

1. 计算公式: (AB X AE ) * (CD X CE) >= 0 && (DA X DE ) * (BC X BE) >= 0 参考: 判断点是否在矩形框(多边形)内_qt opencv 判断一点是否在矩形内-CSDN博客 2.测试结果: 3.实现完整代码: #include<cstd

Python数据分析 Pandas基本操作

Python数据分析 Pandas基本操作 一、Series基础操作 ​ Series是pandas的基础数据结构&#xff0c;它可以用来创建一个带索引的一维数组&#xff0c;下面开始介绍它的基础操作 1、创建Series 1&#xff09;使用数据创建Series&#xff1a; import pandas as pd pd.Series(1…