首页 > 编程语言 >Python字符编码

Python字符编码

时间:2023-12-04 16:24:58浏览次数:40  
标签:编码 utf 字符 Python unicode 格式 硬盘

编码,文字和二进制之间的一个对照表。

【1】阶段一:一家独大(ASCII)

(1)ASCII表的诞生

  • 现代计算机起源于美国,所以最先考虑仅仅是让计算机识别英文字符,于是诞生了ASCII表

(2)ASCII表的特点

  • 只有英文字符与数字的一一对应关系
  • 一个英文字符对应1Bytes,1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符

(3)字母对应ASCII表

  • A-Z:65-90
  • a-z:97-122
  • 0-9:48-57
  • 小写字母对应的数字一定大于大写字母

img

【2】阶段二:诸侯割据(ASCII/GBK/Shift_JIS)

  • 为了让计算机能够识别中文和英文,中国人定制了 GBK

(1)GBK表的特点

  • 只有中文字符、英文字符与数字的一一对应关系
  • 一个英文字符对应1Bytes 一个中文字符对应2Bytes
  • 补充说明
    • 1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
    • 2Bytes=16bit,16bit最多包含65536个数字,可以对应65536个字符,足够表示所有中文字符

(2)各国不同的编码表

  • 为了让计算机能够识别日文字符、英文字符与数字的一一对应关系,日本定制了 Shift_JIS
  • 为了让计算机能够识别韩文字符、英文字符与数字的一一对应关系,韩国定制了 Euc-kr
  • 美国人用的计算机里使用字符编码标准是ASCII
  • 中国人用的计算机里使用字符编码标准是GBK
  • 日本人用的计算机里使用字符编码标准是Shift_JIS

img

(3)多种编码共存的缺点

  • 此时无论是存还是取由于采用的字符编码表一样
    • 所以肯定不会出现乱码问题
  • 但问题是
    • 在美国人用的计算机里只能输入英文字符
    • 而在中国人用的计算机里只能输入中文字符和英文字符....
  • 毫无疑问我们希望计算机允许我们输入万国字符均可识别、不乱码,而现阶段计算机采用的字符编码ASCII、GBK、Shift_JIS都无法识别万国字符
    • 所以我们必须定制一个兼容万国字符的编码表

【3】阶段三:一统天下(unicode)

  • unicode于1990年开始研发,1994年正式公布

(1)unicode的特点

  • 存在所有语言中的所有字符与数字的一一对应关系,即兼容万国字符
  • 与传统的字符编码的二进制数都有对应关系,详解如下
    • 很多地方或老的系统、应用软件仍会采用各种各样传统的编码,这是历史遗留问题。
    • 此处需要强调:软件是存放于硬盘的,而运行软件是要将软件加载到内存的,面对硬盘中存放的各种传统编码的软件,想让我们的计算机能够将它们全都正常运行而不出现乱码,内存中必须有一种兼容万国的编码,并且该编码需要与其他编码有相对应的映射/转换关系,这就是unicode的第二大特点产生的缘由

(2)字符的存储

  • 文本编辑器输入任何字符都是最新存在于内存中,是unicode编码的
    • 存放于硬盘中,则可以转换成任意其他编码,只要该编码可以支持相应的字符
  • 英文字符可以被ASCII识别
    • 英文字符--->unciode格式的数字--->ASCII格式的数字
  • 中文字符、英文字符可以被GBK识别
    • 中文字符、英文字符--->unicode格式的数字--->gbk格式的数字
  • 日文字符、英文字符可以被shift-JIS识别
    • 日文字符、英文字符--->unicode格式的数字--->shift-JIS格式的数字

img

【四】编码和解码

【1】编码(encode)

  • 由字符转换成内存中的unicode,以及由unicode转换成其他编码的过程,都称为编码encode
x = '上'  # 在python3在'上'被存成unicode
res = x.encode('utf-8')
print(res, type(res))  # unicode编码成了utf-8格式,而编码的结果为bytes类型,可以当作直接当作二进制去使用
# b'\xe4\xb8\x8a' <class 'bytes'>

# 只有英文字符和数字,要想编码的话,直接使用前缀b --- 字节对象没有encode方法
s = b'Dream123'
print(s, type(s))
# b'Dream123' <class 'bytes'>

img

【2】解码(decode)

  • 由内存中的unicode转换成字符,以及由其他编码转换成unicode的过程,都称为解码decode
  • 在诸多文件类型中,只有文本文件的内存是由字符组成的,因而文本文件的存取也涉及到字符编码的问题
x = b'\xe4\xb8\x8a'
res = x.decode('utf-8')
print(res, type(res))
# 上 <class 'str'>


s = b'Dream123'
res = s.decode('utf-8')
print(res, type(res))
# Dream123 <class 'str'>

img

【五】utf-8的诞生

【1】引言

  • 如果保存到硬盘的是GBK格式二进制,当初用户输入的字符只能是中文或英文
  • 同理如果保存到硬盘的是Shift_JIS格式二进制,当初用户输入的字符只能是日文或英文……
  • 如果我们输入的字符中包含多国字符,那么该如何处理?
  • 多国字符—√—>内存(unicode格式的二进制)——X—>硬盘(GBK格式的二进制)
  • 多国字符—√—>内存(unicode格式的二进制)——X—>硬盘(Shift_JIS格式的二进制)
  • 多国字符—√—>内存(unicode格式的二进制)——√—>硬盘(???格式的二进制)

【2】解决办法(utf-8)

  • 理论上是可以将内存中unicode格式的二进制直接存放于硬盘中的
    • 但由于unicode固定使用两个字节来存储一个字符
  • 如果多国字符中包含大量的英文字符时,使用unicode格式存放会额外占用一倍空间(英文字符其实只需要用一个字节存放即可)
  • 然而空间占用并不是最致命的问题
    • 最致命地是当我们由内存写入硬盘时会额外耗费一倍的时间
  • 所以将内存中的unicode二进制写入硬盘或者基于网络传输时必须将其转换成一种精简的格式
    • 这种格式即utf-8(全称Unicode Transformation Format,即unicode的转换格式)
    • 我们日常使用的字符编码都是utf8编码,但是,utf系列还有utf16 utf32... utf8mb4
    • utf8只能存储正常的字符,utf8mb4可以存储表情
  • 多国字符—√—>内存(unicode格式的二进制)——√—>硬盘(utf-8格式的二进制)

img

【3】为何在内存中不直接使用utf-8

  • utf-8是针对Unicode的可变长度字符编码:
    • 一个英文字符占1Bytes,
    • 一个中文字符占3Bytes,生僻字用更多的Bytes存储
  • unicode更像是一个过渡版本,
  • 我们新开发的软件或文件存入硬盘都采用utf-8格式
  • 等过去几十年,所有老编码的文件都淘汰掉之后,会出现一个令人开心的场景
  • 即硬盘里放的都是utf-8格式
  • 此时unicode便可以退出历史舞台
  • 内存里也改用utf-8,天下重新归于统一

【六】字符编码的应用

【1】学习字符编码的目的

  • 学习字符编码就是为了存取字符时不发生乱码问题
  • 内存中固定使用unicode无论输入任何字符都不会发生乱码
  • 我们能够修改的是存/取硬盘的编码方式,如果编码设置不正确将会出现乱码问题。

【2】乱码问题

  • 乱码问题分为两种:存乱了,读乱了

(1)存乱了

如果用户输入的内容中包含中文和日文字符,如果单纯以shift_JIS存,日文可以正常写入硬盘,而由于中文字符在shift_jis中没有找到对应关系而导致存乱了

(2)读乱了

  • 如果硬盘中的数据是shift_JIS格式存储的,采GBK格式读入内存就读乱了

(3)总结

  • 保证存的时候不乱
    • 在由内存写入硬盘时,必须将编码格式设置为支持所输入字符的编码格式
  • 保证存的时候不乱
    • 在由硬盘读入内存时,必须采用与写入硬盘时相同的编码格式

【七】Python解释器执行文件

【1】Python解释器执行文件的前两个阶段

  • 执行py文件的前两个阶段就是python解释器读文本文件的过程,与文本编辑读文本文件的前两个阶段没人任何区别

  • 要保证读不乱码,则必须将python解释器读文件时采用的编码方式设置为文件当初写入硬盘时的编码格式

  • 如果没有设置,python解释器则才用默认的编码方式,在python3中默认为utf-8,在python2中默认为ASCII

  • 我们可以通过指定文件头来修改默认的编码

  • 在文件首行加上

    # coding: 当初文件写入硬盘时采用的编码格式
    
  • 解释器会先用默认的编码方式读取文件的首行内容

    • 由于首行是纯英文组成,而任何编码方式都可以识别英文字符。

【3】python解释器执行文件的第三个阶段

  • 设置文件头的作用是保证运行python程序的前两个阶段不乱码
    • 经过前两个阶段后py文件的内容都会以unicode格式存放于内存中。
  • 在经历第三个阶段时开始识别python语法
    • 当遇到特定的语法name = '上'(代码本身也都全都是unicode格式存的)时
    • 需要申请内存空间来存储字符串'上'
    • 这就又涉及到应该以什么编码存储‘上’的问题了。
  • 在Python3中
  • 字符串类的值都是使用unicode格式来存储
  • 由于Python2的盛行是早于unicode的
    • 因此在Python2中是按照文件头指定的编码来存储字符串类型的值的(如果文件头中没有指定编码
    • 那么解释器会按照它自己默认的编码方式来存储‘上’)
    • 所以,这就有可能导致乱码问题
# coding:utf-8
# x的值为untf-8格式的二进制
x = '上'

# 打印操作是将x的值,即utf-8格式的二进制交给终端
# 当终端收到后发现并不是unicode(只有unicode才与字符有对应关系)
# 所以终端会执行操作:utf-8二进制---解码-->unicode格式的二进制
# 解码的过程终端会采用自己默认的编码
# 而在pycharm的终端默认编码为utf-8、windows下的cmd终端的默认编码为gbk
# 所以该打印操作在pycharm中显示正常,而在windows下的cmd中则乱码
print(x)
# 在windows下的cmd中运行效果如下
C:\Users\Administrator>python2 E:\aaa.py
涓
  • python2后推出了一种补救措施,就是在字符串类型前加u
    • 则会将字符串类型强制存储unicode
    • 这就与python3保持一致了
    • 对于unicode格式无论丢给任何终端进行打印,都可以直接对应字符不会出现乱码问题
# coding:utf-8
x = u'上' # 即便文件头为utf-8,x的值依然存成unicode

标签:编码,utf,字符,Python,unicode,格式,硬盘
From: https://www.cnblogs.com/Fredette/p/17875235.html

相关文章

  • 通过Python和大数据技术实现网站内容的个性化推荐
    随着互联网的快速发展,越来越多的人使用网络来获取信息和娱乐。在这个过程中,推荐系统成为了一个非常重要的工具,通过分析用户的行为和偏好,提供个性化的推荐内容,提升用户的体验和满意度。本文将介绍如何使用Python和大数据技术实现网站内容的个性化推荐。一、推荐系统的分类推荐系统根......
  • 如何使用Python提升网站的SEO效果
     Python是一种功能强大的编程语言,可以应用于各种领域,包括优化网站的搜索引擎优化(SEO)效果。本文将探讨如何使用Python来改善网站的SEO效果,并提供一些实用的技巧和工具。 1.网站地图生成器:网站地图是搜索引擎索引网页的重要工具之一。使用Python可以编写脚本来自动生成网站地图,以......
  • 软件测试/人工智能|Python 数据类型解析:探索编程世界的多样性
    数据类型是编程中不可或缺的基本概念。在Python中,有多种数据类型,每种都有其独特的特点和用途。本文将带你深入了解常见的Python数据类型及其实际应用。引言在编程中,数据类型是对数据进行分类和组织的方式。Python中有多种数据类型,每种类型都有其自身的特性和功能。了解这......
  • 软件测试/人工智能|Python 数据类型转换解析:理解数据之间的灵活转换
    引言数据类型转换是指将一种数据类型的值转换为另一种数据类型的过程。在编程中,我们经常需要处理不同类型的数据,正确地进行类型转换是编写健壮程序的关键。常见的数据类型转换整数和浮点数转换为字符串#示例代码num_int=10num_float=3.14str_int=str(num_int)str......
  • 字符编码发展史_编码/解码_可变/不可变数据类型
    【一】什么是字符编码字符编码是一种将字符映射到数字编码的方法。由于计算机内部实际处理的是二进制数据,而字符是人类可读的符号,所以需要一种方式来表示和存储字符。字符编码就是将字符映射为对应的数字编码,以便计算机能够识别和处理字符。【二】字符编码的发展史字符编码的发......
  • 软件测试/人工智能|Python 变量解析:从基础概念到内存地址探究
    变量什么是变量?变量是在程序中用于存储数据的名称。它们可以存储各种类型的数据,比如数字、文本、列表、字典等等。变量类型在介绍变量时,可以提及Python中常见的变量类型,例如整数、浮点数、字符串、布尔值、列表、元组、字典等。如下所示:a=1b='muller'c='123'd=......
  • Python函数介绍
    1.函数1.1函数概述函数定义和优势不同形状正方形打印#2个foriinrange(0,2):forjinrange(0,2):print("*",end="")print()#3个foriinrange(0,3):forjinrange(0,3):print("*",end="")pr......
  • python之字符编码
    【字符编码的发展史】一家独大:ASCII(识别英文字符)-------------诸侯割据(ASCII/GBK/Shift_JIS)---------------一统天下(存在所有语言中的所有字符与数字的一一对应关系,即兼容万国字符,unicode) 字母对应ASCII表A-Z:65-90a-z:97-1220-9:48-57小写字母对应的数字一定大于大写字母 ......
  • Acwing 3240. 压缩编码
    本题大意:使用01串为单词编码,要求:1、编码使用前缀码,即任何一个单词的编码不是另一个单词编码的前缀;2、编码需要按字典序升序排列,比如 \(C\) 的编码的字典序需要 \(D\) 的编码之前。请找出一种字典序编码,使得文字经过编码后的长度\(L\)最小,输出最小长度。原题链接:324......
  • [LeetCode Hot 100] LeetCode3. 无重复字符的最长子串
    题目描述思路:滑动窗口定义需要维护的变量//1.定义需要维护的变量intmax_len=0;Map<Character,Integer>hashmap=newHashMap<>();窗口不满足条件,窗口收缩。窗口不是固定大小所以用while//4.窗口不满足条件:窗口收缩//满足这个条件说明有重复元素//这......