编程语言/文件系统/网络协议存在的那些编码

news2024/11/25 6:44:56

前面的文章介绍了URL编码,UTF8编码,base64,gzip等多种编解码的方式,这里,本节对字符和编码一些杂项进行梳理,相信你会感兴趣。

Python 中的字符和编码

为什么要强调字符编号和字符编码分离这样⼀个概念呢。因为在编程语言中,很重要的一个方面就是处理字符,一门优秀的编程语言应该也要明确这两个概念,而Python 恰巧就是这样的一门语言。尽管在 Python2 中区分的还不是特别的明显,但是在 Python3 中是明确的用str 类表示字符串;bytes 表示字节串,即可以用来存储字符串编码后的值,说明如下:

1,Python3 中使用 str 类来表示和存储字符串,在一个具体的字符串对象中存储的内容是每个字符的编号,该编号就是字符集中赋予的。至于该编号在 Python 中使用个字节来进行存储往往是不确定的,例如常用汉字的编号通常使用两个字节就可以表示编号。对于一些特殊的字符(比如音乐中的那些字符),往往需要更多的字节。这是 Python内部的实现机制,不在过多的阐述,感兴趣的同学在学习完本文方法之后,自行研究尝试。
2,Python 3 中使用 bytes 类来表示和存储字符串编码的值。由于字符对应的编码方式不止一个,包括 UTF-8、UTF-16、UTF-32 以及 GB2312、GBK 等,因此其存储的值通常是编码方式决定的,不同的编码方式下,得到字符串的编码值互不相同;其次编码之后bytes 对象中存储的值和 str 对象中存储的值也是不一样的。

还是以我的 CSDN 博客名称⸺村中少年这几个字符串为例,有前面可知:

1,首先这几个字符的 Unicode 编号分别为 6751、4E2D、5C11、5E74
2,UTF-8 编码后的值为 E6 9D 91 E4 B8 AD E5 B0 91 E5 B9 B4

编写如下程序,并查看对象对应的内存内容:

def printMem(data):
	from ctypes import string_at 
	from sys import getsizeof 
	from binascii import hexlify
	
	print(hexlify(string_at(id(data), getsizeof(data))))
if	name	== "	main	":

	nameStr = '村中少年' 
	nameBytes = nameStr.encode() 
	print(type(nameStr)) 
	print(type(nameBytes)) 
	printMem(nameStr) 
	printMem(nameBytes)

运行结果如下:

<class 'str'>

<class 'bytes'>

b'0500000000000000c0f562b5417f000004000000000000001a53594d- c9e6e066a80a64b5417f00000000000000000000000000000000000000000000000000 000000000000000000`51672d4e115c745e`0000'

b'0300000000000000e0fe60b5417f00000c00000000000000ffffffffffffffff`e69d91e4b8ade5b091e5b9b4`00'

标记的部分分别表示的是字符串中的 Unicode 编号以及 UTF-8 编码后的值,可以看到 nameStr 字符串中的确存储了 Unicode 编号的值,nameBytes 存储的是编码后的值,验证了一开始所说的。这就是 Python 在语言层面上对于字符串和编号的支持,当然非标记的部分是该对象其他部分的值,本次内容不涉及。

下图1是一个外部文件从形成到被 Python 3 读取的一系列操作:
在这里插入图片描述

图1
可以看出文件的形成,包括 Python 源码文件的形成,是符合前面描述的显示和存储相分离; 同时 Python 3 在读取文件的时候都是默认按照字符串形式处理的,即转换成为 Unicode 编号,除非显示的指定为二进制的读取方式。

Python 为什么要使用编号表示字符串本身呢?其实这和前面显示和存储分离的道理一样,字符串无论在何处,无论是写在纸上还是显示在计算机上,其本身的含义不变,因此需要编号这个确定的值来表示。但是在存储的时候,出于效率等方面的考虑,有不同的编码方式,不同的编码方式意味着不同的值, 因此编码值( 不唯一) 来表示字符串是不合适的。 早期使用ASCII、GB2312 这种不区分编码和编号的编码模型问题不大,但是在 Unicode 字符集中不行。通过我的这篇⽂章,相信你对于字符串和其编码⽅式应该能够加以区分。

文件系统编码

由于文件系统的编码和操作系统编码基本保持一致,所以往往我们会忽略。实际上如果在两个不同的文件系统之间移动文件的话,一个非常容易发生的事情就是文件名称的乱码,这个相 信很多同学都有遇到过。由于文件的文件名是是文件系统负责解码显示的,因此如果两个文件系统编码不同,乱码则显而易见。背后的原因其实和文件内容乱码是一样的,即编码写入和解码显示使用的规则不一致。往往是一个采用 GBK 写入,一个采用 UTF-8 读取。

网络协议编码

在 HTTP 协议的协议头部中,有这样一个字段,Content-Type:可以用来告诉协议接收方使用指定的方式解码收到的数据,如下为某个 HTTP 的报文头:

GET / HTTP/1.1
Host: www.guoguo-app.com Connection: close

HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8 
Transfer-Encoding: chunked 
Connection: close
Vary: Accept-Encoding 
Vary: Accept-Encoding 
Content-Language: zh-CN 
Server: Tengine/Aserver

可以看到服务器告诉客户端采用UTF-8 解码收到的数据内容,浏览器或者爬虫在解析 HTTP 头部之后,按照 HTTP 指定方式解码即可正确显示数据内容,比如在线显示一个文本文件。当然这里使用 charset 我觉得不太准确,因为 charset 往往指的是字符集,应该使用charsetEn- coding 比较合适,虽然我们都能够理解其含义。

网页编码

在 HTML网页中通常使用如下标签表示该 HTML 采用的编码方式:

<meta charset="UTF-8">

浏览器在读取该文件的标签后,会按照 utf8 编码方式式显示该文件。 如果该 HTML文件采用GBK方式存储,则浏览器会显示乱码,因为解码方式错误。因此 HTML 文件实际编码要和网页中的 保持一,不然也可能出现错误。这个时候你可能会问,如果协议中的 Content-Type 与网页中的 meta charset 不一致怎么办。这个时候浏览器肯定会做一个取舍,通常的做法是协议响应头优先级比网页中的高。但是事实上浏览器的编写者如何实现,那 就仁者见仁智者见智了。

上述总结计算机系统中编码和字符的一些点,希望对你有所帮助。

本文为CSDN村中少年原创文章,未经允许不得转载,博主链接这里。

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

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

相关文章

A100 GPU服务器安装CUDA教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

02队列及代码实现

队列介绍 队列是一个有序列表&#xff0c;可以用数组或是链表来实现。、遵循先入先出的原则。 &#xff08;先存入队列的数据&#xff0c;要先取出。后存入的要后取出&#xff09; 数组模拟队列 队列本身是有序列表&#xff0c;若使用数组的结构来存储队列的数据&#xff0c;则…

【6月比赛合集】42场可报名的「创新应用」、「数据分析」和「程序设计」大奖赛,任君挑选!

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 创新应用赛&#xff08;39场比赛&#xff09;数据分析赛&…

MySQL—SQL优化详解(上)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

万物的算法日记|第三天

笔者自述&#xff1a; 一直有一个声音也一直能听到身边的大佬经常说&#xff0c;要把算法学习搞好&#xff0c;一定要重视平时的算法学习&#xff0c;虽然每天也在学算法&#xff0c;但是感觉自己一直在假装努力表面功夫骗了自己&#xff0c;没有规划好自己的算法学习和总结&am…

FasterTransformer 001 start up

FasterTransformer Faster Transformer是一个Transformer单层前向计算的高效实现。一个函数由多个OP组合实现。每一个基本OP都会对应一次GPU kernel的调用&#xff0c;和多次显存读写。OP融合可以降低GPU调度和显存读写&#xff0c;进而提升性能。在Faster Transformer&#x…

位姿估计 | 目标体坐标系相对于相机坐标系的位姿估计及其Python代码

目录 引言技术流程1. PNP介绍2. ICP介绍a. 利用ICP求解目标相对相机的位姿b. 利用ICP求解相机帧间运动 Python代码 引言 本文接着分享空间目标位姿跟踪和滤波算法中用到的一些常用内容&#xff0c;希望为后来者减少一些基础性内容的工作时间。以往分享总结见文章&#xff1a;位…

Redis 之Jedis 加springboot整合Redis

Jedis API 文档 在线文档: https://www.mklab.cn/onlineapi/jedis/ Jedis 介绍 Jedis 工作示意图 Java 程序操作Redis 的工具 示意图 Jedis 操作Redis 数据 快速入门 创建maven 项目 注意二步是路径配置自己想放哪里 三步是 定义包的层次结构 嫌弃麻烦的也可以不设置 …

chatgpt赋能python:Python编程技巧:如何横着打印差数列

Python编程技巧&#xff1a;如何横着打印差数列 随着互联网时代的到来&#xff0c;SEO已成为企业推广和营销的重要手段。而作为一名具有10年Python编程经验的工程师&#xff0c;我发现Python编程技巧的学习和应用也可以帮助企业优化SEO排名。本文将从实际项目需求出发&#xf…

如何实现Http请求报头的自动转发之设计

HeaderForwarder组件不仅能够从当前接收请求提取指定的HTTP报头&#xff0c;并自动将其添加到任何一个通过HttpClient发出的请求中&#xff0c;它同时也提供了一种基于Context/ContextScope的编程模式是我们可以很方便地将任何报头添加到指定范围内的所有由HttpClient发出的请求…

基于Java家政服务网站系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

opencv人与摄像头距离、角度检测

参考&#xff1a; https://chtseng.wordpress.com/2018/09/18/%E5%A6%82%E4%BD%95%E4%BC%B0%E7%AE%97%E5%89%8D%E6%96%B9%E4%BA%BA%E7%89%A9%E7%9A%84%E8%B7%9D%E9%9B%A2/ WeChat_20230611160620 1、cv2加载摄像头慢解决方法&#xff0c;单独重新cv2.VideoCapture() https://b…

新《终结者》电影剧本或交由 ChatGPT 书写

据外媒报道&#xff0c;詹姆斯・卡梅隆透露他正在创作下一部《终结者》电影的剧本&#xff0c;他同时表示新剧本的灵感得益于 OpenAI 的 ChatGPT。 打开豆瓣&#xff0c;1984年10月上映的那部「终结者」评分依然在8分以上。而后&#xff0c;终结者系列的电影不断上新&#xff…

基于Java房屋租售网站设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

考研计算机组成思维导图总结(408,833,834)

需要思维导图文件和图片的可以去我的Github上寻找&#xff0c;这份思维导图参考23年王道机组&#xff0c;同时添加了一部分833&#xff0c;834需要知识点。 注意&#xff1a;最后的机组知识点仍要以学院进行对照&#xff0c;这里只是提供参考 思维导图pdf和知识点图片 文章目…

<Linux> 《SUSE Linux 中SSH安全加固》

《SUSE Linux 中SSH安全加固》 1 说明2 安全加固2.1 更改 ssh 默认端口2.2 限制 ROOT 远程登陆2.3 修改默认登录时间2.4 升级旧版本2.5 当用户处于非活动时断线2.6 修改加密协议版本2.7 限制 IP 登录2.8 允许或禁止指定用户和组登录2.9 限制监听 IP2.10 最后修改配置文件的属性…

【JVM 监控工具】JVisualVM的使用

文章目录 前言二、启动JVisualVM三、安装插件四、使用 前言 JVisualVM是一个Java虚拟机的监控工具&#xff0c;要是需要对JVM的性能进行监控可以使用这个工具哦 使用这个工具&#xff0c;你就可以监控到java虚拟机的gc过程了 那么&#xff0c;这么强大的工具怎么下载呢&…

【HBZ分享】FactoryBean的应用 与 BeanFactroyPostProcessor的应用 与 BeanPostProcesser的应用

FactoryBean的应用实战 需要写一个A类来实现FactoryBean实现FactoryBean的3个方法&#xff0c;即getOject(), getObjectType(), isSingleton()注意&#xff1a;在通过xml的【 】标签或者通过注解方式将A类注入容器的时候&#xff0c;返回的实例不是A类&#xff0c;而是T类&…

HTML 基础

目录 HTML 结构 1.认识 HTML 标签 HTML 文件基本结构 标签层次结构 HTML 常见标签 注释标签 标题标签: h1-h6 段落标签: p 换行标签: br 格式化标签 图片标签: img 关于目录结构: 超链接标签: a 链接的几种形式: 表格标签 合并单元格 列表标签 表单标签 form …

【头歌-Python】Python第九章作业(初级)第 1、2、4 关

第1关&#xff1a;绘制温度曲线 任务描述 附件中是某月每天的最高温度和最低温度数据&#xff0c;请绘制本月的高温曲线&#xff08;红色、圆点标记坐标&#xff09;和低温曲线&#xff08;蓝色、星号标记坐标&#xff09;&#xff0c;线型、刻度如输出示例所示&#xff0c;线…