当前位置: 首页 > 编程日记 > 正文

编码小记(未整理-持续更新)

----------------基本概念-------------------------------
一.位:
计算机存储信息的最小单位,称之为位(bit),音译比特,二进制的一个“0”或一个“1”叫一位。
二.字节
字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位,8个二进制位组成1个字节。在ASCII码中,一个标准英文字母(不分大小写)占一个字节位置,一个标准汉字占二个字节位置。
三.字符
字符是指计算机中使用的文字和符号,比如“1、2、3、A、B、C、~!·#¥%…*()+”等等。

-----------------常用的编码的简单分类(3类)---------------

单字节字符编码:
1. 编码标准:ISO-8859-1
2. 说明:
最简单的编码规则,每一个字节直接作为一个 UNICODE 字符。比如,[0xD6, 0xD0] 这两个字节,通过 iso-8859-1 转化为字符串时,将直接得到 [0x00D6, 0x00D0] 两个 UNICODE 字符,即 "ÖÐ"。
反之,将 UNICODE 字符串通过 iso-8859-1 转化为字节串时,只能正常转化 0~255 范围的字符。

ANSI 编码:
1. 编码标准:GB2312,BIG5,Shift_JIS,ISO-8859-2等
2. 说明:
把 UNICODE 字符串通过 ANSI 编码转化为“字节串”时,根据各自编码的规定,一个 UNICODE 字符可能转化成一个字节或多个字节。

反之,将字节串转化成字符串时,也可能多个字节转化成一个字符。比如,[0xD6, 0xD0] 这两个字节,通过 GB2312 转化为字符串时,将得到 [0x4E2D ] 一个字符,即 '中' 字。

“ANSI 编码”的特点:
1. 这些“ANSI 编码标准”都只能处理各自语言范围之内的 UNICODE 字符。
2. “UNICODE 字符”与“转换出来的字节”之间的关系是人为规定的。

UNICODE 编码:
1. 编码标准:UTF-8,UTF-16(BE),UTF-16(LE)等
2. 说明:
与“ANSI 编码”类似的,把字符串通过 UNICODE 编码转化成“字节串”时,一个 UNICODE 字符可能转化成一个字节或多个字节。

与“ANSI 编码”不同的是:
1. 这些“UNICODE 编码”能够处理所有的 UNICODE 字符。
2. “UNICODE 字符”与“转换出来的字节”之间是可以通过计算得到的。

--------------------------------UTF编码简介---------------------------------
UTF-8:
1. 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
2. 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码
3. 一种变长的编码方案,使用 1~6 个字节来存储

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
0020 0000-03FF FFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0400 0000-7FFF FFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

UTF-16:
1. 介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变。
2. 对于 Unicode 编号范围在 0 ~ FFFF 之间的字符,UTF-16 使用两个字节存储,并且直接存储 Unicode 编号,不用进行编码转换
3. 对于 Unicode 编号范围在 10000~10FFFF 之间的字符,UTF-16 使用四个字节存储,具体来说就是:将字符编号的所有比特位分成两部分,较高的一些比特位用一个值介于 D800~DBFF 之间的双字节存储,较低的一些比特位(剩下的比特位)用一个值介于 DC00~DFFF 之间的双字节存储。
4. 位于 0xD800~0xDFFF 之间的 Unicode 编码是特别为四字节的 UTF-16 编码预留的,所以不应该在这个范围内指定任何字符,也就是该范围内在unicode里面不存在对应的unicode编码
5. UTF-16 要求在制定 Unicode 字符集时必须考虑到编码问题,所以真正的 Unicode 字符集也不是随意编排字符的

Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
---------------------+----------------------------------------------------------------------
0000 0000-0000 FFFF | (xxxxxxxx xxxx xxxxx) - (xxxxxxxx xxxxxxxx)
0001 0000-0010 FFFF | (yyyyyyyy yyxxxxxx xxxxxxxx xxxxxxxx) - (110110yy yyyyyyyy 110111xx xxxxxxxx)


UTF-32:
1. 一种固定长度的编码方案,不管字符编号大小,始终使用 4 个字节来存储
2. 以容纳所有的 Unicode 字符,所以直接存储 Unicode 编号即可,不需要任何编码转换。浪费了空间,提高了效率


----------------------名词解释-----------------------
unicode:
1. Unicode是为整合全世界的所有语言文字而诞生的。任何文字在Unicode中都对应一个值, 这个值称为代码点(code point)。代码点的值通常写成 U+ABCD 的格式。
2. Unicode是由美国主要计算机制造商联盟指定的编码字符集,主要用于克服在创建多语言程序和国际化软件时使用的不同编码字符集的混乱。 从版本1.1开始,Unicode严格保持与ISO / IEC 10646及其扩展兼容。 该联盟也是ISO工作的重要贡献者,以进一步发展ISO / IEC 10646
3. CJK就是中日韩的意思。Unicode为了节省码位,将中日韩三国语言中的文字统一编码

ucs-2 & ucs-4:
1. ucs全称是Universal Multiple-Octet Coded Character Set
2. UCS旨在可用于计算机系统和数据通信中的内部数据表示
3. 文字和代码点之间的对应关系就是UCS-2(Universal Character Set coded in 2 octets)。 顾名思义,UCS-2是用两个字节来表示代码点,其取值范围为 U+0000~U+FFFF。
为了能表示更多的文字,人们又提出了UCS-4,即用四个字节表示代码点。 它的范围为 U+00000000~U+7FFFFFFF,其中 U+00000000~U+0000FFFF和UCS-2是一样的。
4. ucs-4结构分为 group plane row cell,每一部分占用一个字节,其中当group和plane为00(16进制)时,是和ucs-2相对应
5. UTF-16是完全对应于UCS-2的
6. UCS-4最高位为0

BMP:
1. 基本多语言面板(Basic Multilingual Plane,简称 BMP)
2. UCS-2 = BMP = plane 00 of group 00


UTF:
1. UCS Transformation Format
2. UTF-8、UTF-16以及UTF-32都是UCS的具体实现,用来存储和传输以及表示
3. UTF-16保存的最小单位为2个字节,UTF-32保存的最小单位为4个字节,所以多字节的编码涉及到字节摆放顺序的问题(大小头)

BOM:
1. Byte Order Mark
2. 是用来标识字节顺序的,只存在于windows平台中,字节流开头的“FFFE”或者“FEFF”也被称为字符"ZERO WIDTH NO-BREAK SPACE"
3. windows平台下的UTF-8编码格式是默认会加上BOM,因为UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式,“FFFE”在UTF-8中的表示为“EF BB BF”(UTF-16的BOM是FEFF),所以如果收到以“EF BB BF”开头的字节流,则表明这是UTF-8编码
4. UTF-16或者UTF-32可以不含有BOM

Big Endian(BE) & Little Endian(LE):
1. ucs-2或者ucs-4中规定的码点在以UTF-16或者UTF-32表示的时候,字节存放顺序的2种
2. 表现为unicode编码的数据中的前2个字节为 "FF FE(Little Endian)",其中windows平台下的默认的Unicode编码为Little Endian的UTF-16
3. 例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前 面?如果将6C写在前面,就是Big Endian。如果将49写在前面,就是Little Endian
大端,高位存储在内存地址的低位
小端,低位存储在内存地址的低位
4. unix或者linux相关的平台使用无bom的utf8作为标准的原因是:一切皆文件,一切文件皆是流,一个流可以被任意的切断,独立解析,而不会改变含义。所以它不能有头,也不能有结尾。由于头根本不存在,所以bom不允许存在
5. windows平台使用带BOM的UTF-8编码的原因是:系统缺省都是用户当前代码页(code page),当前代码页不是utf8,这样,utf8作为非当前代码页格式就无法识别


ASCII:
1.美国(国家)信息交换标准(代)码(America Standard Code for Information Interchange)
2.ISO-8859-1是单字节编码,是以8位作为一个表示单元,相当于是ASCII的扩展,是完全兼容ASCII
3.Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容)

ANSI:
1. 美国国家标准协会(American National Standard Institite)
2. ANSI编码是指不同地区或者国家的编码标准,比如GB2312、GBK或者Big-5编码标准,一般都是使用2个字节来表示一个字符,但也有例外,比如GB18030编码标准中的一些汉字是用3个字节表示,不同的ANSI编码是互不兼容的
3. 在windows或者linux中存在内码页(code page)的概念,也就是不同的非unicode编码是存在不同的页的,比如GBK编码在CP936页,UTF-8的代码页是65001
4. 在操作系统内部,比如windows系列的内码就是Unicode编码,是以UTF-16来表示的,只要安装了对应的代码页,则可以正确显示出字符,记事本中选择ANSI编码保存则是使用系统缺省的编码格式存储数据,可以通过修改系统的地区来达到修改缺省的编码格式
5. 内码是指操作系统内部的字符编码,微软一般将缺省代码页指定的编码说成是内码,在确认了内码后,系统将按照当前的缺省代码页去解释文本文件里的字节流


GB2312:
1. 用两个数来编码汉字和中文符号。第一个数称为“区”,第二个数称为“位”。所以也称为区位码
2. GB2312的原文还是区位码,从区位码到内码,需要在高字节和低字节上分别加上A0
3. “啊”的区位码是1601,写成16进制是0x10,0x01。这和计算机广泛使用的ASCII编码冲突。为了兼容00-7f的ASCII编码,我们在区位码的高、低字节上分别加上A0。这样“啊”的编码就成为B0A1,我们将加过两个A0的编码也称为GB2312编码
(从区位码到内码需要在高、低字节上分别加上A0),但是GB2312的原文还是区位码


-----------------误解纠正-----------------------
误解:“ISO-8859-1 是国际编码?”
非也。iso-8859-1 只是单字节字符集中最简单的一种,也就是“字节编号”与“UNICODE 字符编号”一致的那种编码规则。当我们要把一个“字节串”转化成“字符串”,而又不知道它是哪一种 ANSI 编码时,先暂时地把“每一个字节”作为“一个字符”进行转化,不会造成信息丢失。然后再使用 bytes = string.getBytes("iso-8859-1") 的方法可恢复到原始的字节串。

误解:“Java 中,怎样知道某个字符串的内码?”
Java 中,字符串类 java.lang.String 处理的是 UNICODE 字符串,不是 ANSI 字符串。我们只需要把字符串作为“抽象的符号的串”来看待。因此不存在字符串的内码的问题。
当 UNICODE 被支持后,Java 中的 String 是以字符的“序号”来存储的,不是以“某种编码的字节”来存储的,因此已经不存在“字符串的编码”这个概念了。只有在“字符串”与“字节串”转化时,或者,将一个“字节串”当成一个 ANSI 字符串时,才有编码的概念。
用每“一个字节”就是“一个字符”的转化方法,实际上也就等同于采用 ISO-8859-1 进行转化。因此,我们常常使用 bytes = string.getBytes("iso-8859-1") 来进行逆向操作,得到原始的“字节串”。然后再使用正确的 ANSI 编码,比如 string = new String(bytes, "GB2312"),来得到正确的“UNICODE 字符串”。

-------------------------宽字符和窄字符(多字节字符)-------------------------------------
1. 有的编码方式采用 1~n 个字节存储,是变长的,例如 UTF-8、GB2312、GBK 等;如果一个字符使用了这种编码方式,我们就将它称为多字节字符,或者窄字符。

2. 有的编码方式是固定长度的,不管字符编号大小,始终采用 n 个字节存储,例如 UTF-32、UTF-16 等;如果一个字符使用了这种编码方式,我们就将它称为宽字符。

3. Unicode 字符集可以使用窄字符的方式存储,也可以使用宽字符的方式存储;GB2312、GBK、Shift-JIS 等国家编码一般都使用窄字符的方式存储;ASCII 只有一个字节,无所谓窄字符和宽字符。

转载于:https://www.cnblogs.com/linusflow/p/10049961.html

相关文章:

使用locate 的正则查询 查找所有main.c

locate支持正则查询的功能, 只需输入locate -r 正则表达式 即可。 现在我想查找所有main.c怎么做? 打开终端,输入shell: locate -r main.c$ PS:$表示结束字符串结束。转载于:https://www.cnblogs.com/the-one/p…

My Favorites

AJAX "Atlas" Control Toolkit HomePage "Atlas" Client Class Library "Atlas" Server Class Library ASP.NET AJAX Roadmap http://www.ajaxian.com 被成为AJAX第一站 . http://www.ajaxmatters.com/ 不仅有讨论XMLHttpRequest 的文…

数据库事务初探

使用事务级别要慎重: 因为事务级别越高,数量越多、限制性更强的锁就会被运用到数据库记录或者表中。同时,更多的锁被运用到数据库和它们的覆盖面越宽,任意两个事务冲突的可能性就越大。 如果有一个冲突(例如两个事务试图获取同一个…

数据结构之【队列】的基本操作C语言实现

直接上图: 循环队列的声明: 0、循环队列的声明 循环队列的基本操作: 1、InitQueue(&Q)(构造一个空队列) 2、DestroyQueue(&Q)(销毁队列Q) 3、ClearQueue(&Q)(清空队列Q&…

在python3环境安装builtwith模块

1、安装命令: pip install builtwith 如果在命令行提示如下错误: Fatal error in launcher: Unable to create process using " 使用如下命令: python3 -m pip install builtwith 2、导入模块会出现错误提示: 原因&#xff1…

kettle组件-输出

1:删除连接数据库:新建连接数据库,或者应用转换中已经定义好的数据库。目标模式:指什么现在还不明确,集群模式?子服务器模式?--要写入数据的表的Schema名称。允许表名中包含“.”是很重要的。目…

NGOSS的一点简单概念

NGOSS(Next Generation Operational Support Systems)是由TMF(Tele Management Forum)提出的,他用于电信领域,是构建下一代OSS/BSS系统的框架。TMF提供了技术中立构架(TNA)作为NGOSS…

Windows Mobile 5.0 设备的目录变化

自定义铃声的默认两个存放位置:1. Application Data\Sounds (不是Storage下的Application Data了)。2. 外存储设备的根目录。

第二周期的第一次站立会议

今天:对这一阶段的任务进行了分配,我就自己的任务内容搜集了一些资料,尝试了编程。明天:继续进行编程。遇到的问题:编程方面有些许的困难。转载于:https://www.cnblogs.com/guantianhuan/p/10051436.html

常见的函数式编程模型

1.闭包(Closure) 闭包的概念 可以保留局部变量不被释放的代码块,被称为一个闭包。 闭包的特点:函数嵌套函数、内部函数可以引用外部函数的参数和变量、参数和变量不会被垃圾回收机制收回 // 创建一个闭包 function makeCounter() …

Ubuntu下安装和配置Redis

找到 /ect/redis/redis.conf 文件修改如下:注释掉 127.0.0.1 ,如果不需要远程连接redis则不需要这个操作。使用客户端向 Redis 服务器发送一个 PING ,如果服务器运作正常的话,会返回一个 PONG。默认情况下,Redis服务器不允许远程访问,只允许本机访问,所以我们需要设置打开远程访问的功能。执行sudo apt-get install redis-server 安装命令。查看 redis 是否启动,重新打开一个窗口。停止/启动/重启redis。

自学笔记——1.Pyhton保留关键字

Python保留关键字python保留的关键字如下python保留的关键字如下 and del from None True as elif global nonlocal try assert else if not while break except import or with class False in pass yield continue finally is raise def for lambda…

人的一生有三件事不能等

人的一生有三件事不能等人的一生有三件事不能等 第一是“贫穷” 贫穷不能等,因为一但时间久了,你将习惯贫穷,到时不但无法突破自我,甚至会抹杀了自己的梦想,而庸庸碌碌的过一辈子。。。。。。 第二是“梦想” 梦想不能…

安装部署中的数据库打包和快捷方式启动浏览器

前一段时间&#xff0c;因为工作的需要&#xff0c;学习了一些.net的部署。在打包的过程中遇到了几个问题&#xff1a;<?XML:NAMESPACE PREFIX O />1、 数据库脚本打包&#xff0c;如何修改Web.config文件中的数据联接2、 数据库脚本中的方法和视图打包时要注意的问题…

Windows下安装和配置Redis

下载版本Redis-x64-5.0.14.1.zip。(可能需要开代理)

python练习册 每天一个小程序 第0004题

1 #-*-coding:utf-8-*- 2 __author__ Deen 3 4 题目描述&#xff1a;任一个英文的纯文本文件&#xff0c;统计其中的单词出现的个数。5 参考学习链接&#xff1a;6 re http://www.cnblogs.com/tina-python/p/5508402.html#undefined7 collections http://blog.csdn.…

xxxxxxx

xxxxxxxxxxxxxxxx转载于:https://www.cnblogs.com/pythonClub/p/10054454.html

自学笔记——2.字符串的切片、遍历、查找字符

一、字符串的切片 字符串的部分片段或者子集称为切片操作&#xff0c;所有字符串的切片操作是通过方括号&#xff08;[ ]&#xff09;实现的&#xff0c;语法&#xff1a;[n : m : s] 会返回一个子字符串&#xff0c;从索引值n到n-1之间&#xff0c;以s为步进&#xff0c;即&a…

【EXLIBRIS】随笔记 011

随 笔 记 <十一> 持这种观点的人一个是Dr. Johnson&#xff0c;另一个是西方文化影响更加根深蒂固的Reverend&#xff0c;似乎英文字母&#xff08;Indian-European family&#xff09;那种“抽象的、率意独断”的符号&#xff08;Wai-lim Yip语&#xff09;才是最基本的…

Ubuntu搭建Spark运行环境

前言 因为之前研究的方向是分布式系统&#xff0c;重点放在了Hadoop分布式文件系统上。现如今&#xff0c;社会对机器学习的需求势如破竹。为了调整研究方向&#xff0c;而且不抛弃原本的研究成果&#xff0c;研究反向便从分布式系统转为分布式机器学习算法&#xff08;刚起步&…

hibernate 和 mybatis 的区别

【转载】&#xff1a;JAVA面试中问及HIBERNATE与 MYBATIS的对比&#xff0c;在这里做一下总结转载于:https://www.cnblogs.com/virgosnail/p/10054987.html

VC中基于 Windows 的精确定时

方式一&#xff1a;VC中的WM_TIMER消息映射能进行简单的时间控制。首先调用函数SetTimer()设置定时 间隔&#xff0c;如SetTimer(0,200,NULL)即为设置200ms的时间间隔。然后在应用程序中增加定时响应函数 OnTimer()&#xff0c;并在该函数中添加响应的处理语句&#xff0c;用来…

VMware虚拟机安装之后,打开时找不到启动Centos的界面

#VMware虚拟机安装之后&#xff0c;打开时找不到启动Centos的界面 只要在VMware中打开查看–自定义–库&#xff0c;之后就看到自己已经创建好的虚拟机系统 我也是因为自己不小心上次关机之前把左边那个窗口关闭了

service iptables status无法执行,报错

1. service iptables status 结果为edirecting to /bin/systemctl stop iptables.service Failed to stop iptables.service: Unit iptables.service not load 3.安装Iptables-services 在root 用户下&#xff0c;执行指令 yum installl iptables-services3.设置开机启动 …

Qt5的cmake文件位置

D:\APICenter\Qt\Qt5.8.0\5.8\msvc2015\lib\cmake\Qt5\Qt5Config.cmake转载于:https://www.cnblogs.com/coolbear/p/7149079.html

2018-12-2

博客第一天&#xff0c;今天申请通过&#xff0c;我以为我上个星期就已经申请通过了。没想到博客还得申请一下&#xff0c;哈哈&#xff0c;今天终于成功了&#xff0c;加油哦转载于:https://www.cnblogs.com/h-wei/p/10056227.html

重载、重写和隐藏

重载、重写和隐藏 重载、重写和隐藏是很容易混淆的类似概念。虽然所有这三种技术都使您得以创建同名的成员&#xff0c;但它们之间有一些重要的差异。 重载的成员用于提供属性或方法的不同版本&#xff0c;这些版本具有相同名称但是接受不同数量的参数或者接受不同数据类型的参…

[整理] - Relational Engine之UMS Internals

SQL Server 6.5使用Windows的调度处理管理多线程&#xff0c;和其它Windows应用程序一样&#xff0c;它使用Windows标准API&#xff0c;没有用到任何隐藏API&#xff0c;这使得 SQL Server的工作线程同其它多线程Windows程序完全一样&#xff0c;没有任何特殊的优先级&#xff…

跟踪workflow instance 状态

场景是这样的: 1.workflowruntime启动了持久化和监听服务 2.workfllowruntime创建多个实例,并启动,一些会长时间延时,一些会中途暂停,会不同的执行状态(业务状态) 3.另有一winform控制台,有个表格,刷新显示每个实例的信息,包括业务状态--比如创建,运行,挂起等 4.通过workflowru…

尝试Java,从入门到Kotlin(上)

之前一直使用C#开发&#xff0c;最近由于眼馋Java生态环境&#xff0c;并借着工作服务化改造的契机&#xff0c;直接将新项目的开发都转到Java上去。积攒些Java开发经验&#xff0c;应该对.NET开发也会有所启发和益处。 从理论上说&#xff0c;Java和C#语言差别不大&#xff0c…