Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >对编码的一点理解

对编码的一点理解

作者头像
晚上没宵夜
发布于 2020-05-26 15:18:48
发布于 2020-05-26 15:18:48
7490
举报

平时总是遇到编码问题,遇到就百度,一直不理解,现在找个时间做了下笔记,方便自己理解

1. 为什么需要编码?

我们知道计算机只能存储0和1(即高低电位传递、灯明灭),所有存储在计算机里的信息都会变成 "010010101" 这样看不懂的数字,那么问题来了,如何把 "010010101" 这样的数字转变成我们能看懂的符号?

思路是这样的:

大家约定一套规则,就像小时候玩的传纸条+情报游戏,我们规定用"0001"代表"点"字,用"0003"表示“快”字,用"0020"代表"赞",这样写在纸上 0003 0001 0020 就表示"快点赞"。以此类推,计算机也是这样来表示我们能看懂的符号

所以,编码是把我们看不懂的 0101001 转变成 我们能看懂的符号,此处的编码是广义上的。

而狭义上的编码是指把我们能看懂的符号变成0101的过程,解码就是把看不懂的0101变成能看懂的符号的过程

2. 常见的编码

ASCII

因为计算机先在美国出现,而且也没有考虑到会在全世界推广,所以当时制定了一套表示美国字符的编码规则——ASCII ASCII用一个字节(byte)即8位(bit)来表示符号,这样能有28=256种符号,美国的符号其实用不了那么多,ASCII规定用低7位来表示字符,27=128种,高位用0补充,这样字母,数字,制表符等都能表示了

ISO-8859-1

由于计算机的推广,ASCII不能满足西欧,希腊等国家的符号,所以在ASCII的基础上扩展出了ISO-8859-1,也同样使用单字节表示符号,不同在于高位也利用起来了,即能表示256种符号,这样西欧国家的符号也能表示了

Unicode

随着计算机的广泛使用,ISO组织为了让全世界的符号都在计算机表示,其提出一个新的编码方式(广义)——Unicode。注意:这只是一个符号集,只规定了符号的二进制(即0101这样的)表示,没有规定怎么把这些二进制存储起来

UTF-8

UTF-8是使用最广的一种 Unicode 的实现存储方式,用变长的字节来表示符号,根据Unicode的编号大小,编号小的就用一个字节,编号大的用4个字节,从1-4字不等

UTF-16

Java 以 UTF-16作为内存的字符存储格式,其用16位即两个字节表示 Unicode 的转化格式,是定长的

总结Unicode

Unicode内有世界全部符号对应的二进制表示(很大很大),而这些二进制怎么存进计算机就是UTF-XX的规定了。这些UTF存储的只是转化的格式,用这个格式去Unicode表里按格式查找就能找出对应的字符

简单理解:Unicode是一个存储了各种符号的二维数组,而UTF-XX存储的是该二维数组的下标,那么用这些下标就可从数组中找出对应的符号了

URL编码

URL只能用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。对于特殊的字符则被编码为ASCII十六进制字符,前后用%来标识,空格就被编码为’+’,这样来用规定字符来表示特殊字符

3. 计算机编码

计算机的基本存储单元是字节,所以进行信息传输的也是二进制字节。那么计算机就无法直接传输字符,就需要将字符解析成二进制字节,这个解析操作就叫做编码(encode)。而相应的,将编码的二进制字节还原成字符的操作就叫做解码(decode)

4. Java的编码

java存储时所用的是UTF-8可变的方式、而JVM内存运行时所用的是UTF-16,因为UTF-16是定长的,不用像UTF-8那样再次转换计算,使用方便。

JVM内存运行时(UTF-16),所以char占两个字节。注意:String虽然是char组成,但用了更加灵活的方式存储,英文占一个字符,中文占两个字符,即英文一个字节,中文两个字节,主要提高存储效率,节省空间。这里的话String和char比就不同了

那么一个char占两个字节在utf-16情况下可以存全部的中文了。而在utf-8存储中少部分汉字不能,因为占了3-4字节

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python学习(3):理解计算机中编码三、认识常见的计算机编码
我们学习Python编程,经常对字符串这样的数据进行处理。我们也都知道计算机内部信息是采用二进制编码的,那么这其中的处理原理是什么呢?本篇就计算机中关于编码的知识进行总结。 一、为什么计算机内部信息采用二进制编码 计算机是由逻辑电路组成的,而逻辑电路只有接通与断开两个状态,正好可以对映二进制的“1”与“0”。这样的计算机设计在技术上会简单许多。 二、计算机编码的由来 计算机内部信息采用二进制编码,这决定了它只能直接识别0和1。我们所有各类型数据也都需要被转换为二进制0和1的序列存放在计算机中的。但是这样就产
梧雨北辰
2018/06/07
8140
计算机编码基础
Single
2018/01/04
9960
计算机编码基础
你所不了解的字符编码
前言 在我的工作中,常常会遇到形形色色的字符编码,对于各种编码技术本人了解的也不是很多。 本篇是我了解编码系列的开篇,主要内容讲述字符编码的基本概念,然后介绍一下常见的字符编码,最后说明一下 Java
BUG弄潮儿
2021/06/25
1.2K0
你所不了解的字符编码
各种编码
常见的和编码相关的几个关键词: ASCII Unicode UTF-6,UTF-16,UTF-32 GBK ISO 下面开始一个一个的解释: ASCII码 计算机中所有的信息都是以二进制的形式存在的. 早先美国人发明了计算机,为了用计算机表示他们美国人可以看懂的信息,就将26个英文字母以及一些常用字符用二进制代码表示. 二进制代码和对应的英语字符的关系被规定为ASCII码. ASCII码一共规定了128个字符的编码. 这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位
青木
2018/05/28
7300
字符编码的前世今生——一文读懂字符编码
话说六年级二班有小明、小红两位同学,最近班上开了英语课,学着学着有些无聊,这时候小明想给小红传纸条,但是又担心被发现,突然小明灵机一动,在草纸上写下了一串数字12 9 11 5 21,然后就传给了小红,小红看了一眼莫名其妙,这时候小明冲着小红指了指自己英语书后面的字母表,小红看了几眼字母表,顿时明白过来,原来字母表上面有编号,小红按照编号,将这一串数字转换出来,得到的是like u,羞得小红脸色发红,这可真成了“小红”……
arcticfox
2019/06/26
2.4K0
字符编码的前世今生——一文读懂字符编码
文字与编码的奥秘(下)
在上篇文章中我们已经了解到,计算机内部是采用的二进制进行运算和存储的。通过计算机来代替我们进行日常的工作,必然会遇到如何进行运算以及数据如何进行存储的问题,本篇文章我将和大家一起来了解下文字是如何在计算机中存储的。
老钱
2019/10/25
1.5K1
文字与编码的奥秘(下)
关于字符编码的那些事
一、编码是什么 编码为了某种目的把信息从一种形式集合转换为另一种形式集合的过程,古时的鸣金收兵,从某种意义上讲也是一种编码,将帅发出了退兵的命令,为了让更多的人能够知道这个命令,传令兵把这个信息转换为了锣声,传递了出去 与编码相对的还有解码,解码是根据某种规则将信息恢复到原状的过程,士兵之前都接收过训练,在听到锣声之后,明白到锣声代表退兵,便开始执行这一命令。 旗语,电报中的莫斯电码等等,这些东西里面也包含了编码 二、关于字符集和字符编码 因为计算机中的信息都是用二进制数表示的,所以我们必须将汉字、英文按照
magicsoar
2018/02/06
1.1K0
关于字符编码的那些事
架构师必须掌握的各种编码:ASCII、ISO-8859-1、GB2312...
编码在我们日常开发过程中经常有遇到,常见的编码格式有ASCII、ISO-8859-1、GB2312、GBK、GB18030、UNICODE、UTF-8、UTF-16等,其中GB2312、GBK、GB18030、UTF-8、UTF-16都可以用来表示中文,那么哪种存储中文会比较合适呢,下面会对这几种编码一一介绍便会有结论。 为什么有编码 我们知道计算机中最小的存储单位是字节(byte),一个字节所能表示的字符数又有限,1byte=8bit,一个字节最多也只能表示255个字符,而世界上的语种又多,都有各种不
Java技术栈
2018/03/30
2.3K0
JDK1.9-转换流
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/12/10
6190
JDK1.9-转换流
计算机程序的思维逻辑 (6) - 如何从乱码中恢复 (上)?
我们在处理文件、浏览网页、编写程序时,时不时会碰到乱码的情况。乱码几乎总是令人心烦,让人困惑。希望通过本节和下节文章,你可以自信从容地面对乱码,恢复乱码。 谈乱码,我们就要谈数据的二进制表示,我们已经在前两节谈过整数和小数的二进制表示,接下了我们将讨论字符和文本的二进制表示。 由于内容比较多,我们将分两节来介绍。本节主要介绍各种编码,乱码产生的原因,以及简单乱码的恢复。下节我们介绍复杂乱码的恢复,以及Java中对字符和文本的处理。 编码和乱码听起来比较复杂,文章也比较长,但其实并不复杂,请耐心阅读,让我们
swiftma
2018/01/31
1.5K0
计算机程序的思维逻辑 (6) - 如何从乱码中恢复 (上)?
字节码:ASCII编码:单字节编码,ANSI编码:多字节编码,UNICODE编码:宽字节编码
字符是人们常用的一些记号,比如”1”, “汉”, “お”,”℃”等等,包括各种语系的语言和一些符号都可以被称为字符。 字节是计算机存储数据的存储单元,是一个8位的二进制数,所以最多只能表示256个数字(0-255)。 编码是大家对计算机如何使用字节来表示一个字符的约定,可分为ASCII编码,ANSI编码(本地化编码),UNICODE编码(国际化编码)三种。
学到老
2019/02/14
4.8K0
字节码:ASCII编码:单字节编码,ANSI编码:多字节编码,UNICODE编码:宽字节编码
字符是人们常用的一些记号,比如”1”, “汉”, “お”,”℃”等等,包括各种语系的语言和一些符号都可以被称为字符。 字节是计算机存储数据的存储单元,是一个8位的二进制数,所以最多只能表示256个数字(0-255)。 编码是大家对计算机如何使用字节来表示一个字符的约定,可分为ASCII编码,ANSI编码(本地化编码),UNICODE编码(国际化编码)三种。 1.ASCII编码:单字节编码。 最初的编码,由一个字节组成,因此只能表示256个字符,但只表示0-9,a-z,A-Z,和一些加减乘除百分号,够老美用了
学到老
2018/03/19
3.9K0
字节码:ASCII编码:单字节编码,ANSI编码:多字节编码,UNICODE编码:宽字节编码
理解字符编码:从ASCII到UTF-8及Base64
编码是一种将字符集映射到字节序列的方法。在计算机中,所有数据都以二进制形式存储和处理,因此我们需要一种方法来表示文本字符。这就是编码的作用。
陆业聪
2024/07/23
4700
理解字符编码:从ASCII到UTF-8及Base64
编码总结笔记 原
我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。
wuweixiang
2018/08/14
7760
编码总结笔记
                                                                            原
字符编码
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://polaris.blog.51cto.com/1146394/377468
拾点阳光
2018/09/28
2.4K0
MySQL字符编码指南--基础篇
要了解MySQL的字符编码,解决乱码问题,必须先了解字符编码。我们知道所谓信息,在计算机中不过是一串的位(bit:0 or 1),每8个bit组成了一个字节,而这些字节到底表示什么,取决于读到这些对象的上下文,1个字节序列,可以表示整数,字符串或者机器指令,当然也可以表示中文,日文,甚至上古文字。
DBA成江东
2023/07/15
1.1K0
MySQL字符编码指南--基础篇
【字符编码那些事】ASCII、GB2312、GBK、UTF-8编码以及Unicode字符集
我们在开发中是不是经常会遇到这样的问题,比如你在VS2019中创建了一个工程,里面有C语言程序和中文注释,有一天,根据工作需要,你要把其中的一部分C文件和H文件移植到Keil工程中,当你通过复制黏贴把相应文件移植到Keil工程中,并使用MDK打开时,却发现,你移植的文件C语言程序是正常显示的,但是中文却成了一堆乱码,并且一编译各种莫名其妙的报错。这其实就有可能是你的VS2019和Keil使用了不同的编码方式,因为大部分编码兼容ASCII编码,而C语言程序是英文字符,采用了ASCII编码,所以正常显示,而中文编码就不同了,比如内存中同样的0xB0A1,使用不同编码标准去对0xB0A1解码,得到的可能就是不同的汉字。
mindtechnist
2024/08/08
2.8K0
【字符编码那些事】ASCII、GB2312、GBK、UTF-8编码以及Unicode字符集
万字长文讲解编码知识,看这文就够了!
字符指类字形单位或符号,包括字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号。一般来说我们称某个字符集里面的字符,叫xx字符,如ASCII字符集里面的ASCII字符,GB2312字符集里面的GB2312字符。
杰哥的IT之旅
2020/06/18
3.3K0
万字长文讲解编码知识,看这文就够了!
计算机字符编码的前世今生
有人丢给你下面这张图,如果你能清楚地说明它们之间的关系以及用途,那么你对字符编码的理解肯定过关了。
冬夜先生
2021/10/12
4760
彻底摆脱乱码的困惑
先给大家出个思考题吧,一个汉字占多少字节?是不是网上搜出的答案五花八门,那么读完本篇文章,我希望你至少可以准确知道这个问题的答案,我觉得就算是收获。
帅地
2020/12/11
1.4K0
彻底摆脱乱码的困惑
相关推荐
Python学习(3):理解计算机中编码三、认识常见的计算机编码
更多 >
LV.1
这个人很懒,什么都没有留下~
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档