Ø 那么现在开始康康都有哪些编码方式

 1.  ASCII 

  ASCII ---American Standard Code for Information Interchange,美国信息交换标准代码,

  最新发表于1967年,共128个字符,7位二进制表示,详细的对应见百度百科,比较简单,此处不赘述。

2.  Unicode

  Unicode又被称为万国码,是计算机领域的一项业界标准,包括字符集,编码方案等等。它为每种语言的每个字符设定了统一且唯一的二进制编码,满足跨语言跨平台的文本转换和处理的要求。1990年研发,94年正式公布。

  • Unicode可以理解为一个字符库,理论上包含所有可能出现的字符,两个字节表示一个字符,每个字符都有一个编号,该编号也称为码位;
  • Unicode将这个库分为17个平面,从00-10 (十六进制,0x10=17),每个平面有 65536 个码位,共1114112个字符。这些平面中,第一个Unicode平面,被称为基本多语言平面,Basic Multilingual Plane,缩写BMP,其他平面称为辅助平面Supplementary Planes。
  •  Unicode的编码方案

  重点来了!

  Unicode 只是一个庞大的字符库,将字符进行了编号,在被调用前,还经过了不同的编码处理。

  1)  UCS

  Unicersal Character Set ,通用字符集,根据 ISO 10646 标准定义。又被分为UCS-2,UCS-4,且均采用BOM机制,Bytes Order Mark 机制(确定字节流的大小端序,确定字节流的Unicode编码方案)。

  UCS-2:固定使用2个字节编码,对用第一个Unicode plane。

  UCS-4 :固定使用4个字节编码。

  2)  UTF

  Unicode Transformation Format ,Unicode转换格式的意思

  a) UTF-8

  UTF-8 是一种变长编码方式,为什么是可变的呢,因为一个Unicode字符最大时需要3个字节表示,但有些字符,像简单的英文,只需要一个字节,在网络传输时,可以节省资源.

  对于一个字符,如果一个字节可以表示,那么其最高位二进制为0;多字节,那么第一个字节的最高位起,“1”的个数就是编码后的字节数,其余字节均已10开头。(这没有为什么,就是规定而已,最开始看的帖子没有说明这点,本人就比划了一个下午,搞自闭了,希望大家别踩坑了)

  具体表现方式:

  1字节 0xxxxxxx

  2字节 110xxxxx 10xxxxxx

  3字节 1110xxxx 10xxxxxx 10xxxxxx

  4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 

  5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 

  6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

  可以看到,可用来标识编码的实际位数最多31位,即除去这些1和10控制位外,x的位数,这个编码与Unicode的编码是对应的。Unicode与UTF-8在转换时,先除去高位0,再根据所剩编码的位数,决定所需的最小的UTF-8编码位数。

  具体对应关系如下

十进制

Unicode符号范围(16进制)

UTF-8编码(二进制)

0~127

0000 0000~0000 007F

0xxx xxxx

128~2047

0000 0080~0000 07FF

110x xxxx 10xx xxxx

2048~65536

0000 0800~0000 FFFF

1110 xxxx 10xx xxxx 10xx xxxx

65536~114111

0001 0000~0010 FFFF

1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx

  理解例子:
    如字符‘A’,他的Unicode码位是65,二进制为0100 0001,用UTF-8一个字节即可表示,也是0100 0001,这很直接的说明UTF-8是向下兼容ASCII的。

  再例如这个‘老’字,在Unicode中的码位是63796,对应的Unicode编码为F934,把它转化为二进制是1111 1001 0011 0100,转化为UTF-8编码需要三个字节表示,从低位到高位填入,1110 1111 1010 0100 1011 0100,转换为十六进制就是EFA4B4。

  b) UTF-16

  UTF-16使用2或4个字节编码。若码位在BMP第一平面,使用2个字节,2^16=65536,恰好可以完全表示BMP;BMP外的辅助平面,使用4个字节编码。

  具体编码方式:这4个字节,即16 Bit,被称为代理对。第一部分为高位代理,或前导代理,字节范围(D800~DBFF);第二部为低位代理或后尾代理,字节范围(DC00 ~DFFF)(这部分码位在BMP中是保留的)。

辅助平面码位表示具体规则

  a) Unicode码位转化为16进制,减去0x1 0000 ,将结果扩展20位,高位不足补零。在上面我们有提到,Unicode的范围最大为0x10 FFFF,所以最大差是0x0F FFFF;

  b) 将差按照高低各十位分割;

  c) 高十位扩展至2个字节,再加上0xD800;低十位同样扩展至2个字节,加上0xDC00。

       理解例子:

字符‘A’在BMP范围中,Unicode码位是65,十六进制为0x0041。在传输时,这里会有一个码序问题,是0x4100(小)还是0x0041(大),这个同样依据BOM机制,加入控制信号,大端序时在数据前加上FE FF,小段序则加上FF FE。

字符 在辅助平面内,Unicode码位是66368,其十六进制为0x1 0340。先将0x1 0340-0x1 0000,得到0x0 0340,扩展到20位,且分割高低十位:0000 0000 00|11 0100 0000,高位加上D800;低位加上DC00;得到结果D800 DF40。

  3. ISO-8859

ISO-8859是一系列编码,由8位二进制表示,共256个字符,前128个字符与ASCII码是相同的,后128个字符,每个国家都是不一样的;参考百度百科对应关系。这里简单提一下ISO-8859-1,它是ISO-8859家族中的一位成员,又叫Latin-1,8位为一个字节,很多协议中,默认使用的是该编码;缺点是256个字符还是不够用,常和其他编码方式配合出现。

  

  4.GB2312

GB2312 -1980 是中国国家标准总局1980年发布的《信息交换用汉子编码字符集》的标号。

共收录汉字6763个和非汉字图形字符682个,共7445个;

整个字符集分为94个区,每区94位,共8836个;

每位1个字符,区和位组合对汉字编码,称为区位码

二进制表示字符:将区位码换算为16进制,再加上2020H,就是我们的国标码;国标码加上8080H,就是计算机机内码。

  

  5.GBK

GBK ,”国标扩展”的字母首拼,全称为《汉字内码扩展规范》,制定于1995年12月1日;

GBK向下兼容GB 2312编码,在其基础上,使用双字节编码方案,范围为8140~FEFE(十六进制) (剔除xx7F),共23940个码位,其中21003个汉字。支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。GBK编码方案于1995年10月制定, 1995年12月正式发布,目前中文版的WIN95、WIN98、WINDOWS NT以及WINDOWS 2000、WINDOWS XP、WIN 7等都支持GBK编码方案。

参考链接:

  官网对照Unicode字符编码表地址:https://unicode-table.com/cn

  转化查询参考地址:https://www.qqxiuzi.cn/bianma/zifuji.php

    https://www.qqxiuzi.cn/bianma/Unicode-UTF.php

  https://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html

  https://www.cnblogs.com/leesf456/p/5317574.html

编码理解的漫漫长路(Unicode、GBK、ISO)的更多相关文章

  1. 字符编码-UNICODE,GBK,UTF-8区别【转转】

    字符编码介绍及不同编码区别 今天看到这篇关于字符编码的文章,抑制不住喜悦(总结的好详细)所以转到这里来.转自:祥龙之子http://www.cnblogs.com/cy163/archive/2007 ...

  2. 【JAVA编码专题】UNICODE,GBK,UTF-8区别

    简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那三种编码是一兼容的,同一个汉字,那三个码值是完全不一样的.如"汉"的uncode值与g ...

  3. 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  4. unicode,gbk,utfF-8字符编码方式的区别

    一.编码历史与区别 一直对字符的各种编码方式懵懵懂懂,什么ANSI UNICODE UTF-8 GB2312 GBK DBCS UCS……是不是看的很晕,假如您细细的阅读本文你一定可以清晰的理解他们. ...

  5. 字符编码ANSI、ASCII、GB2312、GBK、GB18030、UNICODE、UTF-8小结

    编码和解码可以理解成二进制和字符(广义的字符,包括汉字等)的映射表,编码即从字符映射至二进制,解码则为逆过程. 1.英语字符编码ASCII 开始计算机只在美国用.8字节一共可以组合出256(2的8次方 ...

  6. Unicode gbk gb2312 编码问题 [转载]

    原文地址: http://www.cnblogs.com/csn0721/archive/2013/01/24/2875613.html HTML5 UTF-8 中文乱码   <!DOCTYPE ...

  7. 【JAVA编码专题】UNICODE,GBK,UTF-8区别 分类: B1_JAVA 2015-02-10 21:07 153人阅读 评论(0) 收藏

    简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那三种编码是一兼容的,同一个汉字,那三个码值是完全不一样的.如"汉"的uncode值与g ...

  8. JAVA字符编码一:Unicode,GBK,GB2312,UTF-8概念基础

    第一篇:JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础 来源:holen'blog   对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16, ...

  9. 编码的来源于格式简介ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE

    编码一直是让新手头疼的问题,特别是 GBK.GB2312.UTF-8 这三个比较常见的网页编码的区别,更是让许多新手晕头转向,怎么解释也解释不清楚.但是编码又是那么重要,特别在网页这一块.如果你打出来 ...

随机推荐

  1. MySQL数据库参数调优方法

    怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一段时间后运行,根据 ...

  2. effective-java学习笔记---使用标记接口定义类型40

    标记接口(marker interface),不包含方法声明,只是指定(或“标记”)一个类实现了具有某些属性的接口. 例如,考虑 Serializable 接口.通过实现这个接口,一个类表明它的实例可 ...

  3. TorchScript简介

    本教程是对TorchScript的简介,TorchScript是PyTorch模型(nn.Module的子类)的中间表示,可以在高性能环境(例如C )中运行. 在本教程中,我们将介绍: PyTorch ...

  4. dome 模块 pyaudio 声音处理 为语音识别准备

    dome 模块 pyaudio 声音处理 为语音识别准备 直接上例子 dome1 声音强度检查 import pyaudio import numpy as np class QAudio: CHUN ...

  5. Java实现tif/tiff/bmp图片转换png图片

    package org.analysisitem20181016.test; import java.io.File; import java.io.FileOutputStream; import ...

  6. A - 你能数的清吗 51Nod - 1770(找规律)

    A - 你能数的清吗 51Nod - 1770(找规律) 演演是个厉害的数学家,他最近又迷上了数字谜.... 他很好奇 xxx...xxx(n个x)*y 的答案中 有多少个z,x,y,z均为位数只有一 ...

  7. Java基础知识2-Java基本语法

    数据类型 1.Java程序的基本组成 关键字:被Java语言赋予特定含义的单词,不能作标识符,如private. 标识符:由数字.字母.$和_组成的字符串,用于引用变量.且首字母不能是数字. 变量:程 ...

  8. Java引用的分类

    Java引用分为强引用.软引用.弱引用和虚引用. 强引用就是指在程序代码中普遍存在的,类似“Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被 ...

  9. Golang微信支付跳过X509验证

    游戏支付提交到微信的post: 微信: https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=23_4 错误信息: err:Post ...

  10. Java第二十六天,多线程等待换新机制(严格执行化)

    代码: 1.老板类: package com.lanyue.day26; public class bossRunnable implements Runnable { public myLock l ...