【常见的编解码场景】

2023-11-17

在软件领域内,有诸多编码解码的应用场景,而对于编码一词的使用,在不同场景下也会有不同的语义表达,很多软件开发人员不堪其困扰,至少我本人是经历了很波折的一些过程。

举几个场景,比如:

  1. 字符集跟字符编码有什么关系,字符集就是字符编码么?
  2. 乱码,从网络上下载的文件,本地打开乱码到底是为何?
  3. dubbo请求链路中,编解码是怎么处理的,dubbo的编解码跟其他场景的编解码有何不同?
  4. Http body中header中定义的charset跟编码,压缩的关系是什么?
  5. Http url中文场景下,在浏览器中为何会出现百分号?
  6. http协议中定义的编码方式和字符集,分别是什么意思?
  7. http的请求过程中,到底哪些地方有编码,序列化,整个过程是怎样的?

本文总结并梳理在日常工作过程中,编解码的一些场景以及不同场景下编解码语义上的一些差异,希望在沟通对焦以及阅读相关文档的过程中对于编解码的含义,更聚焦和明确,对大家的日常工作有所帮助。

一,编码与解码

哲学中成对出现的概念。
在讲清楚这一对矛盾体之前,先试着给它们下个定义:

  • 编码是信息从一种形式或格式转换为另一种形式的过程;
  • 解码是编码的逆过程。

在计算机领域,1和0是计算机存储和识别的最小单元,计算机外的信息转化成计算机能识别的形式就需要编码了。当然在计算机领域内部,也存在着各种格式转换(也称为编码),比如TCP/IP四层协议转换,各层的格式是不同的;应用进程中,对象转成字节码,转成json,xml等。

区分在各种不同的场景下编码的具体语义,可能会有点让人头疼!我们把范围画小些,聚焦下,我们讲述的是计算机应用内,应用间,网络通信,数据存储等场景下的编码;该种形式的编码最终目的是存储(持久化到磁盘)和传输(网络通信,或应用进程通信)。
我们以软件从业人员常见的几种场景开始讲起:

1.1 字符编解码

我们规范下本文的语义:字符编码指的是字符转换成字节,字符解码是从字节转换成字符。

所有的软件开发人员都遇到过乱码的问题,比如:在文本存储时,选择gb2312编码保存中文汉字,这时候使用utf-8编码格式打开文本,就会出现乱码,如下:
在这里插入图片描述

字符集和编码

至于为何会乱码,在讲清楚乱码原因之前,我们先对焦两个概念:字符集和编码格式, 这两个概念在很多场景下总是混在一起,我们有必要先对齐,讲清楚。
● 字符集用于用户展示,比如:“中国”二字使用gbk字符集时,映射为:D6D0 B9FA;而在unicode字符集下映射为:4E2D 56FD。 当使用错误的字符集去展示时,乱码就出现了。
● 编码用于存储以及网络传输,gbk既是字符集也是编码格式,unicode是字符集,utf-8是其常用的编码格式(其他还有utf-16,utf-32等)。

编解码过程分析

有点绕,我们以文本编辑器(vi等)为例,描述下整个过程:在mac os的LANG="zh_CN.UTF-8"的前提下,内存中的字符集使用unicode,我们使用vi编辑器打开一空文本,输入’中国‘二字,‘中国’两个字在内存中对应的字节为:4E2D 56FD,大家在屏幕上看到了‘中国’两个字;当保存时,使用utf-8进行编码,变成了:E4B8AD E59BBD,存储到磁盘。文件的字符集和编码方式为:UTF-8 Unicode text

admin@admindeMacBook-Pro ~ % cat test.txt 
中国 

admin@admindeMacBook-Pro ~ % file test.txt 
test.txt: UTF-8 Unicode text

当我们重新打开文件时,数据从磁盘加载到内存,使用utf8解码, 使用unicode字符集,内存中存储为:4E2D 56FD,用户界面展示出 ‘中国’二字。
另外说明下,gbk既是一种字符集也是编码格式,当我们os环境是gbk且使用gbk编码存储时,内存以及磁盘存储都是D6D0 B9FA。
这里可能有同学会问了,为何unicode不使用4E2D 56FD直接存储而使用utf8存储呢,存储的字节反而更多更长了? 这是因为unicode是定长的编码方式,每个字符用16byte存储;而utf8是变长的编码方式,兼容Asccii编码,英文字符只需要8byte存储,对于大部分存储英文字节的场景,在空间上更有优势。

“中国”二字使用不同的字符集,对应的byte码如下:
● unicode表示为: 4E2D 56FD
● UTF-8表示为: E4B8AD E59BBD
● GBK表示为: D6D0 B9FA

编解码举例

我们仍然以mac系统(LANG=“zh_CN.UTF-8”)为例,分别对比下,英文字符“ab”和中文字符“中国”的存储以及显示器展示,

** 对于英文字符“ab”来说 **,
磁盘存储时使用utf-8编码,十六进制表示为“6162”;
读取到内存中时,十六进制对应的是 “00610062”;
显示器前,unicode字符集映射,用户看到则的是“ab”
“ab”字符的编码解码以及显示器展示的过程表示如下:
在这里插入图片描述

** 对于中文字符“中国”来说** ,
磁盘存储时使用utf-8编码,十六进制表示为“E4B8ADE59BBD”;
读取到内存中时,十六进制对应的是 “4E2D56FD”;
显示器前,unicode字符集,用户看到则的是“中国”
编码解码以及显示器的展示过程表示如下:
在这里插入图片描述

1.2 http url编码

讲完了文本字符编码后,我们再看一下另一种常见的编码方式:http url编码。
RFC3986文档对Url的编解码问题做出了详细的讲述,指出了哪些字符需要被编码,以及编码规则是什么,如下:

Url中只允许包含以下四类字符:
1、英文字母(a-zA-Z)
2、数字(0-9)
3、-_.~ 4个特殊字符
4、所有保留字符

关于保留字符,RFC3986中指定了以下字符为保留字符(英文字符): ! * ’ ( ) ; : @ & = + $ , / ? # [ ]。 Url可以划分成若干个组件,协议、主机、路径等。有一些字符(

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【常见的编解码场景】 的相关文章

随机推荐

  • 机器人教育对思维能力和创新能力有益

    发展人工智能机器人教育 从孩子的思维和技术能力创新上抓起不仅重要而且必须 格物斯坦小坦克认为机器人教育更多的是采用引导的方式 激发孩子们的想法 重在培养孩子的的思维 心理素质以及动手能力 在制作机器人的过程中 孩子需要动手实践锻炼思维逻辑能
  • 2020年06月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

    一 单选题 共25题 每题2分 共50分 第1题 以下哪种输入结果不可能得到以下反馈 重要的事情说三遍 安全第一 安全第一 安全第一 A print 重要事情说三遍 安全第一 3 B print 重要事情说三遍 安全第一 安全第一 2 C
  • Python基础知识总结

    Python基础知识总结 字符串 字符串操作 字符大小写转换 长度填充与删除 string模块函数 进制转换 列表 列表之星操作 字典 字典操作 字符串 字符串操作 序号 分类 函数 方法 描述
  • 编译Linux内核

    一 首先下载好内核源代码 首先在命令行窗口中执行下面这条命令 apt cache search linux source 执行用这条命令系统会提示你安装适合你内核版本的内核源码 然后选择其中一种内核版本 到www kernel org内核官
  • Jenkins持续集成项目实践 —— 基于Python Selenium自动化测试(二)

    上一篇讲了如何搭建jenkins 这篇主要讲 怎么将自动化代码与jenkins衔接起来 jenkins上运行的两种方式 第一种 在jenkins上面运行本地代码 操作如下 新建项目 项目名称根据自己项目情况填写并选择自由模式 进行配置根据如
  • R语言入门教程知识 第二章 赋值代码与命名规则

    快捷键 新建脚本 Ctrl shift N 清理控制台快捷键 Ctrl L 赋值快捷键ALT 赋值法 1 符号方式赋值 对象名 lt 对象值 2 函数方式赋值 assign 对象 对象值 三大基础函数 numeric 数值型向量 logic
  • 上网原理大透析(MAC,IP,掩码,DNS)

    一 概述 1 1 五层模型 互联网的实现 分成好几层 每一层都有自己的功能 就像建筑物一样 每一层都靠下一层支持 用户接触到的 只是最上面的一层 根本没有感觉到下面的层 要理解互联网 必须从最下层开始 自下而上理解每一层的功能 如何分层有不
  • 内联函数的使用及注意点

    内联函数并不总是内联 Inline function是在C 中引入的一种机制 它可以拓展函数代码 避免调用函数的额外开销 在Linux环境下 gcc编译选项必须加上优化选项才能使inline有效 inline与static的关系 在这儿有一
  • Kafka之基础笔记

    1 kafka offset 存储 1 1 去zookeeper依赖 比较广为人知的Kafka offset存储方式为zookeeper 在0 8版本时 默认依然是zk 但是此时其实已经出现另外一种offset存储方式了 Kafka以 co
  • 如何在ios中集成微信登录功能

    在ios中集成微信的登录功能有两种方法 1 用微信原生的api来做 这样做的好处就是轻量级 程序负重小 在Build Settings 中这样设置 然后设置 友盟的设置同上 但是要注意 加入你需要的所有框架到应用程序中
  • VUE3父子组件传值defineProps() 和 defineEmits()

    defineProps 和 defineEmits 都是只能在
  • 二十三种设计模式第十九篇--命令模式

    命令模式是一种行为设计模式 它将请求封装成一个独立的对象 从而允许您以参数化的方式将客户端代码与具体实现解耦 在命令模式中 命令对象充当调用者和接收者之间的中介 这使您能够根据需要将请求排队 记录请求日志 撤销操作等 命令模式的核心组成部分
  • yaml数组解析_【社区精选】一文看懂 YAML

    本文原作者为陈皮皮 2020年6月11日发布于 微信小游戏开放社区 原文 一文看懂 YAML 前言 YAML 并不是一种新奇的语言 YAML 首次发表于 2001 年 距离现在已经过去差不多 20 个年头 YAML 虽然不如 JSON XM
  • 16/32/64平台上不同内置数据类型所占的字节数大小

    https blog csdn net qq 32535249 article details 88077019 utm medium distribute pc relevant none task blog baidujs title
  • 银行对公账户编码规则

    银行对公账户编码规则 1 工商银行 2 农业银行 3 中国银行 4 建设银行 5 邮储银行 更多 1 工商银行 中国工商银行对公账户共19位 其中1 4位为地区代码 详见代码表 5 8位为网点代码 9 10位为应用号 11 17位为序号 1
  • 计算机网络复习7---差错检验CRC循环冗余检验

    这部分在书中P74页 具体步骤已经写的非常清楚了 这里不做详细介绍 这里着重说一点 是我在刚才复习时才发现一直弄错的地方 希望大家不要出错 在模2除法时 被除数应该是 待传数据 n个0 被除数不是 代传数据 这个很重要 n个0怎么确定呢 书
  • easyexcel 学习

    EasyExcel EasyExcel是一个基于Java的简单 省内存的读写Excel的开源项目 在尽可能节约内存的情况下支持读写百M的Excel 语雀 写excel 引言 首先简单讲解一下EasyExcel的写语法 方便理解后续的代码 最
  • 什么是深度学习,如何进行深度学习?

    深度学习的必要性 改革开放40年 基础教育研究与实践的最大成就之一 就是树立了 学生是教育主体 的观念 但是 在课堂教学中 学生并未真正成为主体 大多数课堂教学也没有发生根本变化 为什么 因为大多数教学改革尚未抓住教学的根本 对课堂教学的研
  • java开发sublime插件_开发者最常用的8款Sublime text 3插件

    5 SublimeCodeIntel Sublime Code Intel 作为一个代码提示和补全插件 支持Javascript Mason XBL XUL RHTML SCSS python HTML Ruby Python3 XML S
  • 【常见的编解码场景】

    常见的编解码场景 一 编码与解码 1 1 字符编解码 字符集和编码 编解码过程分析 编解码举例 1 2 http url编码 1 3 http body编码 1 4 压缩编码 1 5 对象编码 netty框架中的编码解码 dubbo框架的编