什么是编码,什么是解码。原理解读

2023-11-18

原文:http://www.cnblogs.com/luguo3000/p/3592562.html

编码问题一直都伴随着程序猿从不间断,刚开始学编程的时候好多次遇到编码问题,解 决了文件读取的编码问题,又遇到了网络编码问题,解决了网络编码问题又遇到了数据库编码问题。总结一下无非就是编码原理没搞清楚,希望本文能从原理上让菜 鸟们理解编码,遇到问题可以从原理上搞定编码。

一.编码

人类先有了自己的语言,交流了若干个世纪,然后出现了计算机。可惜计算机只认0和1,人类只能认文字,双方都不能妥协,那就必须要有一个从文字到0、1的映射了。从文字到0、1的映射称为编码,反过来从0、1到文字叫解码。

具体什么 是编码?先来咬文嚼字一下吧。编就是将某样东西按照一定的规则放到一起,码在这里是数字的意思。编码就是将某东西编成数字。比如邮政编码,就是将不同范围 内的邮局编成不同的数字。计算机里只有0和1,编码就是将文本字符编成一系列的0和1,看起来好像是废话啊,但这确实是编码的本质。

后来经过编码,计算机屏幕上终于可以显示“Hello World”了。学计算机之前谁都不知道有这么一个过程,因为一切看上去都理所当然。这种根深蒂固的认识让我们对编码理解起来犯了难。

首先屏幕 的显示跟计算机存储是两码事,屏幕对应人们的视觉认知,它是无形的,你找不出来在哪里刻了这么两个单词,而计算机存储是客观存在的。计算机里只有0和1, 怎么来表示“Hello World”呢(假如我们在美国),那就需要将字母数字及标点符号编一个号。一个字节可以表示256个数字,表示字母数字标点足够了,所以用一个字节就可以对应一个字符了。这样一来计算机在显示文字的时候,先将0、1解码成对应的文字,然后在屏幕上渲染出来就可以了。我们将“Hello World”叫做字符,计算机实际存储的是字符对应的编号,这些编号就叫字节流。

上边这种编码就是ASCII码,如果计 算机只在美国用或者只显示英语,那编码就是透明的,谁都不需要去关心编码,一切都觉得理所当然。可是计算机应用到了像中国这样的国家,这些国家的语言哪里 只是几个字母啊,有成千上万种不同的字符。很显然ASCII码就不能满足需求了,怎么办呢,每个国家都研制自己的编码呗,很显然这样做并不长久,每个国家 都有自己的编码实在有点乱,连两个国家的语言都不能放在一起。所以可以将世界当成一个整体,把所有的文字统一编号,这时候就出现了unicode编码。用 一个字节来表示一个字符显然是不够的,unicode编码用了两个字节来表示一个字符。其实,编码的发展过程并没有这么顺利,中间还是出现了很多其他的编 码,以后的文章可以详细说一下几种常用的编码。那问题岂不是解决了,大家都用unicode不就完事了吗,哪有这么简单呢,unicode出现之前计算机 领域已经有很多成型的操作系统软件甚至标准,不可能都统一改成unicode编码。所以到现在还是会遇到编码问题,unicode只是给我们提供了一种统 一解释所有文字的编码方案。要搞清楚,这里讨论的编码都是针对文本字符的。

二.乱码

编码之所以受到关注,乱码几乎起到了决定性的作用,如果没有乱码,一切都让大家觉得顺理成章,那谁还会关注编码呢。

出现乱码的原因就是文本字符编码过程与字节流解码过程使用了不同的编码格式,这个往往归咎于解码格式选择错误,也就是说在解码的过程中出现了问题。如 果我的字符是用utf-8编码,你用GBK解码那肯定出问题。因为文字按照utf-8的编码规则编成的0、1,按照GBK的规则解码回来的文字并不是原来 的文字,这时候就会出现乱码了。这种问题会出现在文件读写、网络编码传输、数据库存取上。只要牵涉到字符都有可能出现乱码,因为只要有字符就会有解码过 程。

还有一种 情况就是文件压根不是文本文件,也就是说根本就没有经过编码这个过程,那你去解码当然乱码了。比如64,你如果看做文本字符就是6和4两个字符,可以对应 编码格式进行编码。如果看做是数字64,那对应的存储结构是01000000,就没有编码过程,也就不需要去解码。

要 搞清楚的一点就是同样的文本字符,经过不同的编码,在存储结构上是不一样的,但是代表的字符是一样的,不同编码真正的区别在于存储结构。反过来,相同的存 储结构,经过不同的解码,对应的文本字符并不一样,但是在内存上结构上并没有改变。如果碰到乱码,不要慌张,因为原始存储结构一动没动,只不过用错了解码 方式。就像一千个读者有一千个哈姆雷特一样,真实的哈姆雷特就在那里。

乱码是显示在屏幕上才被认为是乱码,也就是说乱码取决于人的感官,乱码只有人才知道﹐计算机不认为这是乱码。

三.文件编码

不管是文本还是图片或视频,在计算机存储上都是一视同仁,全都是字节流。但是 从方便人们阅读的角度上还是分为文本文件和二进制文件。文本文件的可视形式就是文本字符,在存储和显示时有文本字符编解码的过程,可以直接用文本编辑器阅 读。除文本文件以外就是二进制文件,不同类型的二进制文件都有相应的结构标准,例如java的class文件,前四个字节代表文件类型,后边两个字节代表 大版本号,再后边两个字节代表小版本号。具体哪些字节代表什么意思,值是float类型还是int类型,都有一定的标准,所以需要特定的软件按照标准去读 取解析。

在不同的编程语言中,往往提供不同的类对文本文件和二进制文件进行读写。最常 用的就是文本文件的读写例如C#中有StreamReader和StreamWriter,Java中有BufferedReader和 BufferedWriter。还有二进制文件的读写例如C#中有BinaryReader和BinaryWriter,Java中有 DataInputStream和DataOutputStream。当然读写二进制文件的类也可以读写文本文件,因为文本文件和二进制文件的存储在本质 上是没有区别的,都是二进制。只不过专门读写文本文件的类封装的更好,读写文本文件更方便。

云卷云舒
原创文章 166获赞 304访问量 42万+
关注 他的留言板

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

什么是编码,什么是解码。原理解读 的相关文章

  • VirtualBox与windows网络不通处理

    VirtualBox设置桥接 另 vmware类似问题 2022 2 1 更新 nat网络 新的虚拟机创建后 ip 如图 在windows上ping 虚拟机 显示网络不通 在对应虚拟机上右键 gt 设置 选择网络 将原来的 网络地址转换 N
  • mysql替换字段的域名

    需求 网站域名更换 需要一键替换全部域名或者替换原有的图片域名 使用sql update table set 字段名 replace 字段名 a xxxx cn bvvv bbbbbbb com
  • 疲劳驾驶监测方案_盘点疲劳驾驶的几种检测方法

    随着人们生活水平的逐渐提高以及各大城市道路交通系统的不断完善 我国的汽车保有总量也在不断增加 这在为人们的出行带来便捷的同时也导致了交通事故的频频发生 对驾驶员和行人的生命财产安全构成了巨大的威胁 根据我国交通部相关调查信息显示 当今诱发交
  • iphone14到手了?你还需要一个专职管家!

    现在距离苹果秋季新品发布会已过去月余 新iPhone 14系列和新版的iOS 16操作系统也如约与我们见面了 相信大家在9月初抢购的iPhone 14也基本到手了 但随之到来的数据资料备份迁移却是一件令人头大的事情 使用官方提供的iTune
  • k8s功能介绍和常用命令

    一 Node篇 kubectl get nodes 查看所有node信息 kubectl get nodes owide 查看所有node的详细信息 kubectl get node o yaml 查看所有node的yaml文件 kubec
  • python: 获取 后缀名(扩展名) / 文件名

    method 使用 os path splitext file 0 可获得 文件名 使用 os path splitext file 1 可获得以 开头的 文件后缀名 code import os file Hello py 获取前缀 文件
  • [YOLO专题-26]:YOLO V5 - ultralytics代码解析-detect.py程序的流程图与对应的plantUML源码

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122443972 目录 第1章 det
  • 海南大学软件工程原理835考研

    海南大学835考研 2023考研已经落幕 我从2022 05 2023 03 用了大概一年的时间 目前已被海南大学计算机科学与技术学院录取 下面来谈谈我的学习感想 希望能给大家带来帮助 对于专业课 我用的是张海藩的软件工程导论第六版 和史济
  • MySQL数据库中随机获取一条或多条记录

    在开发过程中遇到了一个问题 使用MySQL数据库 用SQL语句在表中随机获取一条或多条数据 看似简单 但是往深层研究的话还是很有深度的 查了好多资料 接下来给大家分享一下 1 随机获取单条数据 SELECT FROM table name
  • springboot学习(一)——helloworld

    以下内容 如有问题 烦请指出 谢谢 springboot出来也很久了 以前零散地学习了不少 不过很长时间了都没有在实际中使用过了 忘了不少 因此要最近准备抽时间系统的学习积累下springboot 给自己留个根 因为以前学过一些 这里就主要
  • IDEA学习(一)——IDEA的安装

    最近IDE从Eclipse转到了IDEA 抽时间熟悉了一下IDEA相关的东西 在此记录一下说不定可以帮到有需要的同学 我们就先从IDEA的安装说起吧 需要说明一点的是IDEA是比较吃内存的 所以在安装IDEA之前最好确认的内存不要太小 最好
  • JavaScript运算符

    1 JavaScript运算符 算数运算符 运算符也叫做操作符 通过运算符可以对一个或则多个值进行运算 并获取运算结果 算数运算符 加 可以对两个值进行加法运算 如果是两个字符串则进行字符串拼接 任何值和字符串做加法运算 都会先转为字符串
  • 数据结构如何计算复杂度

    在学习具体的数据结构和算法之前 每一位初学者都要掌握一个技能 即善于运用时间复杂度和空间复杂度来衡量一个算法的运行效率 通过算法所编写出的程序的运行效率 程序的运行效率具体可以从 2 个方面衡量 分别为 程序的运行时间 程序运行所需内存空间
  • 熵值法计算权重有异常值_熵权法评价估计详细原理讲解

    写在前面 熵权法也属于一种综合评价方法 没有主观性 可与前面几篇文章提到的方法联合使用 目录 一 熵权法概述 1 1 信息论基础 1 2 熵权法介绍 二 熵权法赋权步骤 2 1数据标准化 2 2 求各指标在各方案下的比值 2 3 求各指标的
  • 一篇关于LLM指令微调的综述

    深度学习自然语言处理 原创作者 cola 指令微调 IT 是提高大型语言模型 LLM 能力和可控性的关键技术 其本质是指在由 INSTRUCTION OUTPUT 对组成的数据集上以监督的方式进一步训练LLM的过程 它弥合了LLM的下一个词
  • 线程连接池

    第一种 Executors newCacheThreadPool 可缓存线程池 先查看池中有没有以前建立的线程 如果有 就直接使用 如果没有 就建一个新的线程加入池中 缓存型池子通常用于执行一些生存期很短的异步型任务 package tes
  • FFPlay视频播放流程

    背景说明 FFmpeg是一个开源 免费 跨平台的视频和音频流方案 它提供了一套完整的录制 转换以及流化音视频的解决方案 而ffplay是有ffmpeg官方提供的一个基于ffmpeg的简单播放器 学习ffplay对于播放器流程 ffmpeg的
  • 机器学习 day31(baseline、学习曲线)

    语音识别的Jtrain Jcv和人工误差 对于逻辑回归问题 Jtrain和Jcv可以用分类错误的比例 这一方式来代替 单单只看Jtrain 不好区分是否高偏差 可以再计算人类识别误差 即人工误差 作为基准线来进行比较 Jtrain与base
  • npm 常用指令介绍

    npm usage what is npm 实现js代码的复用 分享和管理 npm consists of three distinct components 1 the website 通过 www npmjs com 网址查找需要的 包

随机推荐

  • html 浇水动画,纯CSS3实现动画插件spinkit

    spinkit使用CSS3的特性实现多种动画效果 元素移动 放大缩小 翻转 进度条加载效果等等 使用了很多CSS3新的特性 是一个学习CSS3不错的网站 spinner width 30px height 30px background c
  • echarts自定义Y轴刻度及其颜色

    yAxis min 0 max 5 axisLabel color 999 textStyle fontSize 14 fontWeight 400 设置分段颜色 color function value console log 试试 va
  • 4399 C++笔试题

    1 写出一个函数 取到链表中倒数第二个节点 双链表 node getSec List mylist return mylist m tail gt m prev m prev为链表前指针 单链表 node getSec List mylis
  • 如何利用Jmeter从0到1做一次完整的压测?这2个步骤很关键!

    压测 在很多项目中都有应用 是测试小伙伴必备的一项基本技能 刚好最近接手了一个小游戏的压测任务 一轮压测下来 颇有收获 赶紧记录下来 与大家分享一下 希望大家能少踩坑 一 压测的时机 压测的时机很重要 如果时间选择不对 可能会做无用功 简单
  • 防止sigmoid和tanh激活函数溢出的C++实现

    引言 上一期 我们介绍了softmax函数的C 实现 但是考虑到sigmoid和tanh函数也是带 e e e的次幂 所以现在我们来考虑该函数的防止溢出实现 sigmoid函数 原理 该函数的公式为 1 1
  • 第一百三十六回 WillPopScope组件

    文章目录 概念介绍 使用方法 示例代码 我们在上一章回中介绍了下拉刷新组件相关的内容 本章回中将介绍 WillPopScope组件 闲话休提 让我们一起Talk Flutter吧 概念介绍 我们在本章回中介绍的WillPopScope组件是
  • 这篇文章讲清Python的7大学习路线(建议新手小白收藏)

    现如今铺天盖地都是来自学习Python的勇士 Python这个编程语言中最友好的语言早已不是高不可攀的状态了 无论是业余爱好 还是专职求学 学习Python的朋友都在依靠着自己的方法 勤勤恳恳的学习着 但是学习有方向 入门有方法 进阶更是需
  • python爬虫详解

    python爬虫详解 1 基本概念 1 1 什么是爬虫 网络爬虫 是一种按照一定规则 自动抓取互联网信息的程序或者脚本 另外一些不常使用的名字还有蚂蚁 自动索引 模拟程序或者蠕虫 随着网络的迅速发展 万维网成为大量信息的载体 如何有效地提取
  • Ubuntu安装腾讯会议提示不支持wayland

    Ubuntu安装腾讯会议提示不支持wayland sudo vim etc gdm3 custom conf 把 WaylandEnable false 的注释井号去掉 sudo service gdm3 restart 横屏重启后可用 u
  • jeesite实战(四)——用户权限

    系列文章目录 提示 这里可以添加系列文章的所有文章的目录 目录需要自己手动添加 例如 第一章 Python 机器学习入门之pandas的使用 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一
  • 命名实体识别(NER)综述

    本文是中文信息处理课程的期末考核大作业 对于自然语言处理主流任务的调研报告 版权声明 本文为CSDN博主
  • aix 查询服务器型号,aix系统查询服务器的配置文件

    aix系统查询服务器的配置文件 内容精选 换一换 本章节指导用户在mdadm配置文件中添加新建RAID阵列的信息 例如设备名 UUID等 系统启动时 通过查询文件中配置的信息 启动运行可用的RAID阵列 本文以云服务器的操作系统为 Cent
  • GB/T 20984-2022《信息安全技术 信息安全风险评估方法》解读

    前言 近年来 信息安全风险评估工作逐步在国家基础信息网络及重要行业信息系统中普遍推行 信息安全风险评估是信息安全保障工作的基础和重要环节 日前 GB T 20984 2022 信息安全技术 信息安全风险评估方法 发布 将于2022年11月1
  • c++ 函数

    1 程序示例 include phc h include
  • 说说background属性

    一 前言 backgound 相信接触前端的人都已经很熟悉了 但是小白们都只是停留在background fff的层面上 那么今天作为小白的我要揭竿而起了 二 简述 用作 描述背景 的css属性 background是一系列背景属性的简写
  • MySQL数据库(面试必备)

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net ThinkWon article details 104778621 文章目录 数据库
  • python绘制直方图根据不同分类_如何在python中绘制具有多个类别的直方图

    下面是一个使用Matplotlib中的 为每个箱子提供多个条的直方图示例 import numpy as np import matplotlib pyplot as plt length of flowers np random rand
  • 数据清洗:重复值识别和处理方法

    重复值识别 数据集中的重复值包括以下两种情况 数据值完全相同的多条数据记录 数据主体相同但匹配到的唯一属性值不同 示例如下 导入pandas库 import pandas as pd 生成重复数据 data1和data3完全相同 data1
  • idea设置鼠标自定义放大缩小代码字体问题

    快捷键 Ctrl Alt S 这是在设置IntelliJ IDEA 代码字体的快捷键设置缩小 怎么达到的了 就是ctrl 你的鼠标滑扭往下
  • 什么是编码,什么是解码。原理解读

    原文 http www cnblogs com luguo3000 p 3592562 html 编码问题一直都伴随着程序猿从不间断 刚开始学编程的时候好多次遇到编码问题 解 决了文件读取的编码问题 又遇到了网络编码问题 解决了网络编码问题