关于字符集的学习笔记

字符集学习总结 学习字符集的一些问题及解决,还有一些关于字符集的基础知识的学习。 立即下载

大家知道,在计算机中,数据都是以二进制的形式来表示的,只有 0 跟 1。而我们在电脑屏幕上看到的能够被我们所理解的这些都是字符,不管是中文也好,英文也好,它们被存储到计算机内部的时候,都会被转换成二进制。

那用什么样的二进制来显示什么样的字符呢,这就是由人们来决定了,这就是所谓的编码。

也正因为此,出现了各种各样的编码方式,比如ASCII,UNICODE,还有和我们汉字相关的GB2312和GBK等。

ASCII

ASCII码是大家最熟悉的一种编码方式了,是在上个世纪60年代(1961年)由美国制定的一套标准,原来是美国的国家标准,后来被ISO定为国际标准,在今天,所有的机器上都支持ASCII编码集。

ASCII码基本上是对英文字母和二进制的编码转换,它共由7位二进制位表示,因此其一共能表示128个字符,其中0~31 是控制字符(不能打印出来),还有96个可以打印出来的字符,包含数字,大小写英文字母和一些标点符号等。

但是由于计算机存储的基本处理单位为字节(Byte),也就是8位,所以一般会以一个字节来存储ASCII码,那么最高位就会置0。


从上表,我们可以看到,ASCII码仅支持英文,如果全世界通行的语言就只有英文,那就简单了,也就不会有那么字符编码格式了,但是很可惜,事实上不是这样的。

世界的多元化发展,造就了多姿多彩的语言,比如现在我们大家都看到的汉字,对吧。

每一个汉字就像每一片树叶,都是独一无二的。那么仅仅有128种状态的ASCII码表,是没有办法来满足汉字的表达的。

于是有一些西欧国家,就决定利用ASCII码中的闲置的最高位,这样的,利用8位编码,它们能够表示256种状态,也就是说他们能够利用扩展的ASCII码来表示256个字符。

对于这一些以拉丁字母为主的西欧国家,256个字符是足够的。

但是却存在一个问题,不同的国家,原来的0-127个ASCII码,大家都保持不变,还是统一的,但是在128-255这一段的编码都是按照自己国家的语言来表示,就会出现这样一个问题:

同样的编码,在不同的国家,显示为不同的字符。

在互联网还不普及,全球化交流没那么频繁的时候,这种缺陷还不明显,但是在当今这个时代显然是不能拉受的。

因为计算机显示任何一种字符,都必须要先知道对应的编码方式,否则就会显示乱码了。

另外,对于我们亚洲国家,尤其是汉字来说,256个字符还是远远不够的!


ANSI编码和MBCS

于是为了显示本国的语言,不同的国家和不同的地区分别制定了不同的标准,于是就产生了诸如GB2312(简体中文字符集),BIG5(繁体中文字符集)等各种不同的编码标准。

由于汉字远远不只256个字符,所以这些编码方式都采用了2字节的编码方式,在Windows系统上一般称之为ANSI编码(Windows-1252),也称为多字节字符集(MBCS, Multi-Bytes Character Set)。

这是针对Windows系统的,在中文Windows操作系统下,ANSI编码就是GB2312编码,而在日文操作系统下,ANSI编码就是JIS编码。

但是不同的ANSI编码是没有办法互相转换的,谁也不认识谁。

于是我们又回到了之前的一个问题,在当今这个全球化的时代,我们必须有一个统一的字符集能够包含所有的字符。


Unicode

Unicode,我想应该是universal code的合拼,它表明就是整个宇宙所有的编码都会包含在这里面,当然,目前也就是地球而已,不包含火星文。


Unicode将目前世界上通用的所有的字符都收纳了进来,为每一个字符分配了一个唯一的Unicode,比如U+4E00就是汉字的“一”,通过UltraEdit等工具,我们可看看其保存为UTF-16时的编码格式如下:


我们是将文件保存为UTF-16的编码格式的,那么UTF-16和Unicode有什么关系呢,上面内容显示的“FF FE”又是表示什么意思呢?

在这里,我们首先要明确一点, 那就是Unicode只是一个字符集,它只定义了在Unicode中,一个符号其对应的16进制是什么,比如上面汉字的“一”,其对应的Unicode就是4E00,除此之外,它不干其他事情。

为什么Unicode不定义字符的存储结构呢?

我觉得主要原因在于资源的存储和传输的问题,比如对于ASCII码里面的英文字母,它们当然也包含在Unicode中,如果Unicode统一规定了一个字符要用多少个字节来存储,那么很显然肯定不只能用一个字节,因为除了英文字母,

还有其他语言字符。那如果用2个或者更多个字节,ASCII码又用不了这么多,每次存储都要用好多的00000在前面,这多浪费资源,传输起来也会有效率的问题。

很显然,这就决定了会有多种Unicode的存储方式,比如我们上面讲到的UTF-16,其他的还有我们经常用到的UTF-8,还有UTF-32等。

偶尔,我们还会看到UCS-2和UCS-4,它们跟Unicode有什么关系呢?其实Unicode字符集,就是叫做Unicode字符集,英文也就是 Unicode Character Set,即UCS,那么UCS-2就是表示用两个字节,也就是16位来表示的Unicode了。

但是要注意一点,基于维基百科,UTF-16是用来取代UCS-2的。

UCS-2表示的Unicode中从U+0000到U+FFFF这段范围的字符,但是在这段字符中,U+D800到U+DFFF是作为无字符来保留的,而UTF-16,则是利用了这段保留位置保存了位于U+010000到U+10FFFF的字符集。

所以,虽然两者都是只能表示2^16个字符,但其范围是不一致的。

至于UCS-4,就是UTF-32是一样的了。

说到这里,相信大家,也就清楚了,其实UTF-16,也就是一种对Unicode的实现方式,只是它对于Unicode中U+0000到U+FFFF这段字符的存储格式的实现。

而由于都是两个字节,所以基本上Unicode的值是什么,UTF-16的实现也就是什么值,以致于很多情况下人们把Unicode跟UTF-16都划上等号了,其实,它们一个是定义,一个是实现的存储方式。

因为正好是两个字节,那么计算机到底将哪个字节保存在前,哪个字节保存在后呢?都是可以的,这就涉及到一个字节序的问题了。

字节序

字节序也称之为Byte Order Mark,也就BOM,就是上面保存形式中的FF FE了,这是Unicode规范中的推荐方法。

Unicode字符中,定义了这样一个字符串,U+FEFF,叫做“zero-width non-breaking space”。在存储字符前,添加这样一个BOM,来表明编码的顺序,告诉CPU应该先存高字节,还是低字节。

Little Endian: 一般叫小尾,添加FF FE,表明是反过来存储,先存低字节(后面的字节),再存高字节(前面的字节),比如汉字的“一”,其Unicode值为U+4E00,则如果选择UTF-16(Little Endian)在存储方式,则就会是上图中的存储了。

Big Endian:一般叫大尾,会在字符前面添加FE FF,正好反过来,按顺序先保存高字节,再保存低字节,存储为FE FF 4E 00了,如下图所示。


上面所述的,一般就是UTF-16的存储方式,但其限定了固定两个字节的存储方式,而UTF-8,则是以一种变长的存储方式,慢慢地变成互联网上最流行的一种字符存储和传输方式。

UTF-8

UTF-8,可以使用1-4个字节来表示一个符号,其编码规则如下:

对于单字节的符号,第一位设为0,后面的七位设置为其Unicode值,也即是ASCII码了。

对于n(n > 1)字节的的符号,第一个字节的前n位设置为1,第n+1位设置为0,而接下来每个字节的前两位固定为10,之后将该符号对应的unicode值的二进制位按顺序填充剩下的位数。

具体形式如下:

Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx


根据这个表格,我们可以看看汉字“一”,变成UTF-8编码的值为多少。

其Unicode值为4E00,其范围在0000 0800 - 0000 FFFF这个区间,可见其是要用三个字节来编码的,其二进制为0100 1110 0000 0000,则可知其UTF-8的二进制为1110 0100 1011 1000 1000 0000,转化为16进制为 E4 B8 80 00,接下来让我们将上面的“一”字保存成UTF-8格式吧


结果如上图所示,那么EF BB BF又是什么呢?

UTF-8是以8位为单元对Unicode进行编码的,所以其是以字节为单位来编码的,那么就不存在什么字节序的问题了,而EF BB BF其实是对FE FF的编码来的。

既然不存在字节序的问题了,为什么还要在前面添加这个BOM呢?

这是因为,可以利用这个BOM来表明编码方式,当接收到EF BB BF开头的字符串的时候,我们就知道后面的字符串是以UTF-8编码的。

好了,结束!

DSSAT模型实战:从基础配置到气候情景模拟 本文详细介绍了DSSAT模型在农业模拟中的应用,从基础配置到气候情景模拟的全流程实战指南。通过土壤-植物-大气连续体的动态关系建模,DSSAT能精准预测作物产量,误差率低至8%。文章涵盖气象数据处理、土壤参数配置、管理措施调控等核心技巧,并提供了Python脚本和可视化方法,助力农业科研与决策。 阅读详情

相关推荐

1.Fay-UE5数字人工程导入(UE数字人系统教程)

ue5数字人系列教程(含源文件工程)

1万+

字符集个人笔记

btye[] getBytes(String charsetName) //使用指定的字符将该String编码为一系列字节,将结果存储到新的字节数组中。btye[] getBytes() //使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中。由于Unicode会先通过UTF-8,UTF-16,以及UTF-32的编码成二进制后再存储到计算机,其中最为常见的就是UTF-8.注意:GBK是中国的码表,一个中文以两个字节的形式存储。

weixin_42376775的博客 200

滤波器设计实战:Filter Solutions软件从入门到精通

本文是Filter Solutions滤波器设计软件的实战指南,从入门到精通。通过设计一个低通数字滤波器的完整流程,详细讲解了参数设置、FIR/IIR选择、窗函数及逼近函数应用。文章重点介绍了如何利用这款经典工具高效完成滤波器设计、性能权衡,并将设计成果导出至MATLAB等平台进行实际验证与应用,是信号处理工程师提升效率的实用参考。

weixin_29095049的博客 529

Unicode 字符集学习笔记

字符集软件的本地化要解决的真正问题,实际上就是如何来处理不同的字符集。多年来,许多人一直将文本串作为一系列单字节字符来进行编码,并在结尾处放上一个零。对于我们来说,这已经成了习惯。当调用s t r l e n函数时,它在以0结尾的单字节字符数组中返回字符的数目。 问题是,有些文字和书写规则(比如日文中的汉字就是个典型的例子)的字符集中的符号太多了,因此单字节(它提供的符号最多不能超过 2 5 6个

Efren_Yang的专栏 636

国内优秀MES开源框架

一套springboot 开源框架 代码标准规范化。 界面展示 演示地址 http://wangziyangmes.pzzd.xyz 用户名admin 密码123 系统管理 工艺管理 计划管理 物料管理 *用户管理* *工艺路线管理* 工单下达...

q707231019的博客 2万+

CKAD-CN 考试知识点分享(2) CronJob

成功创建 CronJobppi,每 5 分钟执行一次计算任务;配置了和;设置,超时自动终止;确保 Pod 不重启;手动创建ppi-testJob 验证功能正常;所有任务要求均已满足。

轻的博客 329

字符集学习笔记(二)

参考http://www.discuz.net/thread-407264-1-1.html 一、如何选择字符集: 1.如果你所在地区是大陆实用简体字的地方,且不打算考虑外国朋友的浏览要求,可以考虑实用GBK编码。 2.如果有对外(国)的需要,或者英文比较多的论坛,或者论坛中可能会有相当大部分的英文字符(比如经常交流代码的),可以选择UTF-8编码:UTF-8编码的文字可以在各国各种支...

小黑的成长记录 204

自动驾驶仿真 (三)—— 基于PreScan与Simulink的AEB系统仿真

自动驾驶仿真三—— 基于PreScan&Simulink的AEB系统仿真1. AEB自动紧急制动系统1. 1 TTC碰撞时间模型1. 2 C-NCAP法规部分术语与定义1. 3 主动安全ADAS系统试验项目2. AEB仿真分析建模2.1 搭建场景2.2 传感器建模2.3 添加AEB控制系统3. 典型工况仿真3.1 CCRs仿真测试3.1 CCRm仿真测试4. 参考学习的书目教材 博主前面的博文已经介绍了Prescan&Simulink基本的场景建模及仿真分析流程,《自动驾驶仿真 (二)——

zhudj08的博客 1万+

字符集和字符编码学习笔记

字符集和字符编码学习笔记 http://www.king-liu.net/146/#comment-26

java_huashan的专栏 695

HyperMesh二次开发实战:自动化Comp与材料属性批量绑定

本文详细介绍了HyperMesh二次开发中自动化Comp与材料属性批量绑定的实战技巧。通过TCL脚本实现批量创建属性卡、智能材料分配和异常处理,大幅提升前处理效率,适用于汽车、航空航天等领域的复杂模型处理。

weixin_29214691的博客 689

4-都2026年了,嵌入式发展前景怎么样,还适合入行吗?

本文系统分析了嵌入式行业的发展前景,指出到2026年嵌入式将迎来由"万物智联"驱动的黄金周期。文章回顾了嵌入式技术的四个演进阶段,从专用计算机到AIoT时代,强调其技术积累的延续性。作者从人才流向、产业智能化转型、高校新增专业等角度论证嵌入式行业的蓬勃发展,并提出"铁三角"模型分析其驱动力和护城河。最后给出职业发展路径建议,认为嵌入式适合长期主义者,在智能汽车、边缘计算等领域有广阔前景。文章建议读者抓住产业升级机遇,选择这一稳定且有复利效应的技术赛道。

指尖动听知识库 388

字符集学习笔记(一)

  摘自http://bbs.9ria.com/viewthread.php?tid=19624 我们国家先后搞过三套汉字编码标准,既GB2312、GBK和GB18030。   一、GB2312 GB2312又称为GB2312-80字符集,全称为《信息交换用汉字编码字符集·基本集》,由原中国国家标准总局发布,1981年5月1日实施。共7445个图形字符,其中包括6763个汉字,一级...

小黑的成长记录 237

建立时间与保持时间

建立时间与保持时间的计算 文章目录1、建立时间与保持时间概述及模型2、寄存器之间数据传输时建立时间与保持时间3、寄存器之间数据传输时建立时间余量与保持时间余量计算4、 FPGA允许的最大时钟频率或最小时钟周期5、计算FPGA时钟所允许的最大频率或最小时钟周期6、违反建立和保持时间会发生什么? 1、建立时间与保持时间概述及模型 建立时间(Tsu): 在时钟采样之前,输入必须稳定一段时间,该时间量称为建立时间。 理想最优建立时间: 保持时间(Th): 在时钟沿之后输入到触发器稳定所需的最短时间。 理想最优

Crazzy_M的博客 3万+

MySQL学习笔记1:MySQL字符集和字符集编码

可以理解为某些字符组成的一个集合,集合中由哪些字符组成是由制定这个字符集的协会来决定。如大名鼎鼎的ASCII字符集,含有128个字符,就是一个典型的字符集。:将字符集中的字符映射为特定的字节或者字节序列,它表示的是一种规则。通常特定的字符集采用特定的编码方式。即一种字符集对应一种字符编码,如: ASCII、ISO-8859-1、GB2312、GBK都是表示了字符集又表示了对应的字符编码,但是特例,它对应的字符编码有:UTF-8、UTF-16、UTF-32等,mysql中常用的是UTF-8,其他两种不常用。

honvin的博客 4236

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

字符集(学习笔记)

前段时间粗浅的研究了一下mysql,对于mysql的字符集感觉没有任何具体印象,于是写此文,作以记录。 1.字符集变量值 show variables like'char%'; 2.set names utf8 character_set_client = utf8; character_set_connection = utf8; character_set_result

smells2的专栏 893

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[学习笔记]字符集编码

一、什么是字符集?什么是编码?字符(Charcter)是文字与符号的总称,包括文字、图形符号、数学符号等。一组抽象字符的集合就是字符集(Charset)。字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。一组有共同特征的字符也可以组成字符集,比如繁体汉字字符集、日文汉字字符集。字符集的子集也是字符集。计算机要处理各种字符,就需要将字

phphot 1611

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

MySql学习笔记之——字符集

字符集 1、字符集概述 简单的说字符集就是一套文字符号及其编码、比较规则的集合。 2、常见的字符集 字符集 是否定长 编码方式 其他说明 ASCII 是 单字节 7 位编码 最早的奠基性字符集 ISO-8859-1/latin1 是 单字节 8 位编码 西欧字符集 GB 2312-80 是 双字节编码 早期标准 GBK 是 双字节编码 虽然不是国标,但支持的系统不少 GB 18030 否 2 字节或 4 字节编码 开始有一些支持,但数据库支持的还很少 UTF-32 是

前尘忆梦的博客 472

Mysql学习笔记四,字符集

字符集概述字符集: 一套文字符号及编码、比较规则的集合。 ASCII: 最早的标准字符集, 包含英文字母、阿拉伯数字、标点符号和33个控制字符。定长,一个字符7位编码。 Unicode: 为了统一各种语言,基本能包括所有已知再用的字符。 一个字符4个字节编码。UTF-8/UTF-16 定义了这个4个字节的编码在计算机中如何表示(如部分ASCII可以单字节表示, 等等) UTF-8: 非定长,1

cscpswang的博客 515

字符集 学习笔记

rougishiki214的博客 135

java202303java学习笔记第三十五天IO流中unicode字符集2

java

qq_41632427的博客 93

Oracle学习笔记 字符集概述

Oracle 学习笔记 字符集概述 这节课开始讲oracle里面的字符集 偏重于原理和简单的一些判断以及实现 字符集它涉及到很多的东西 比如建库和操作系统环境 这节课把字符集的原理性的东西以及常见的操作讲一下 大家以后不要在字符集方面犯一些错误 以后字符集的问题基本都可以解决了 一)字符集的发展 通过查找各方面资料 这里把字符集的发展自己先简单梳理了一下 字符集是编号和字

韵筝的博客 2214

mysql字符集maxlen_Mysql 字符集(学习笔记十)

show charcater set;show variables like '%character%';1.查看mysql所支持的字符集指令:SHOW CHARACTER SET;很多很多,这里就不全部放上来了,这里的charset代表字符集,就是编码对应字符的集合,后面的collation代表了字符序,字符序就是每种不同的字符集在比较时采用的不同的方法。只要表上有的字符集,就可以被我们采用。c...

weixin_39796363的博客 501

编码和字符集的学习笔记

目录 一,什么是编码和字符集 一,什么是编码和字符集 编码: 编码(Encoding)是一种计算机编程语言的代码,是信息从一种形式或格式转换为另一种形式的过程。通常是用预先规定的方法将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。[1]编码在电子计算机、电视、遥控和通讯等方面广泛使用。 字符集: 字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包

weixin_63432798的博客 284

MySQL学习笔记——字符集

字符值包含字母、数字和特殊符号。在字符值可以存储之前,字母、数字和字符必须转换为数值代码。所以必须建立一个转换表,其中包含了每个相关字符的数值代码。这样的转换表就称为字符集,有时也称为代码字符集(code character set)和字符编码(character encoding)。       要想让计算机处理字符,不仅需要字符到数值的映射,还要考虑如果存储这些数值,所以便诞生了编码方案的概

jiangzc86的专栏 1020

【学习笔记】shell通配符,字符集,字符集扩展

通配符: 所谓通配符,指的时一种文件名的样式,可用来比对文件名,以找到相符的文件。 *:代表任意的字符串,可以是空字符串 ?:代表一个字符,但不可以为空 例如:列出/usr/bin下所有的文件 ls -la /usr/bin/* 列出/usr/bin下,文件名长度为4的文件: ls -la /usr/bin/???? 字符集合: 字符集合的符号是中括号:[] [a-z...

dijiaojin2236的博客 146

mysql字符集(mysql学习笔记)

对于拉丁系语言,比如英语,包含了一系列的字母,其中每个字母只需要1个字节来保存,其他语言(如日语和韩语)则包含了大量字符,每个字符的存储需要多个字节,因此这类字符集被称为多字符集。mysql可以使用各种字符集来存储数据,包括单字符集和多字符集,可以使用show 命令来查看服务器所支持的字符集:第四列 maxlen>1 name该字符集为多字符集。在安装mysql服务器时,latin1字符集将...

拾荒者 317
上一篇: Android与WebView的插件管理机制
下一篇: 关于数字证书和数字签名的一些认识
linmiansheng
博客等级 码龄20年 507粉丝 111原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值