编码格式详解

  • 一.常见的几种编码格式
    • 1.ASIIC
    • 2.GB2312
    • 3.GBK
    • 4.Unicode
    • 5.UTF8
  • 二.GBK和UTF8的相互转换
  • 附录

一.常见的几种编码格式

1.ASIIC

最早的计算机使用的编码方式,使用一个字节表示一个字符;
特点
用0-127(7位)表示一个字符

2.GB2312

计算机流入中国后,因为ASIIC只使用一个字节表示字符,而汉字有好几千个,1个字节无法满足表示所有汉字的需求。
特点
①用双字节表示一个汉字,单字节表示一个英文字符(保持和ASIIC一致)
②一个小于127的字符的意义和原来相同,但是两个大于127的字符连在一起时表示一个汉字;
③范围:低字节(A1-F7),高字节(A1-FE)
④解码时,逐个字节检查,如果该字节的值小于127,则表示这个字符是一个ASIIC字符。如果这个字节的值大于127,则这个字节是中文字符的一部分,接着检查其后面一个字符。将前后两个字符组合起来,就可以得到该中文字符的GB2312编码,接着转换为中文字符;

3.GBK

GBK的出现是因为GB2312可以表示字符还是不够用,很多中文字符在GB2312标准中还是无法表示,因此,对GB2312标准做了一些修改,衍生出GBK。
特点:
①和GB2312一样,GBK也使用2个字节表示中文字符,使用一个字节表示ASIIC码;
②中文字符的第一个字节大于127,第二个字节没有小于127的限制。解码时通过确定某一个字节是否大于127来确定是某一个中文字符的开始;
③范围:低字节(0-255),高字节(A1-FE)
④解码时,逐个字节检查,如果出现某个字节的大于127,则该字节表示某个中文字符的高位,其后面一个字符不管是否大于127一定是该中文字符的低位.

4.Unicode

国际统一标准。
为了解决不同国家针对不同类型的编码方式,ISO制定了一种可以统一所有标准的编码标准(划重点,是统一,非兼容);
特点:
①unicode标准使用两个字节表示任何字符(中文,英文,ASIIC,Korea,欧洲字符等)。ASIIC字符用unicode编码时,其第一个字节为0;
②范围:高字节(0-255),低字节(0-255)
③解码时,从文件开头,每两个字节组合成一个字符的编码,对其解码并结合unicode表,即可解码;

5.UTF8

unicode统一了不同语言的编码格式,但是unicode字符在存储时存在一个问题,会造成存储空间的浪费。试想,一个全部是英文字符的文件通过unicode编码格式存储时,其存储空间存在一半的空间是无效的。因为英文字符用一个字节就可以区分。utf8为了解决这个问题出现;
特点:
①基本规则:

  • 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
  • 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
    ②编码
    根据字符在unicode表中的位置决定改字符使用哪种模式存储。utf8提供了三种模式:
模式 UTF8 UNICODE
单字节 0xxxxxxx 0000 - 007F
双字节 110xxxxx 10xxxxxx 0080 - 07FF
三字节 1110xxxx 10xxxxxx 10xxxxxx 0800 - FFFF

解释:
单字节模式:对于unicode编码在0000-007F范围内的字符,其utf8编码为单字节,该字节最高位固定为0,其他位是unicode码的二进制格式;
如:
字符’a’在unicode编码表中是0x61,其二进制位110 0001,因此,其UTF8编码为:0110 0001
双字节模式:对于unicode编码在0080-07ff范围内的字符,其utf8编码为双字节,取其二进制码的低6位存入低字节的xxxxxx,剩下的位存入高字节的xxxxx,位数不够,高位补0;
如:
'Σ’字符在unicode编码中位03A3,二进制格式为:11 1010 0011,
根据03A3,可以确定其应使用双字节存储,因此,其模板为110xxxxx 10xxxxxx,将0011 1010 0011的后6位100011填入10xxxxxx,剩下的位1110填入110xxxxx,则得到’Σ’的utf8编码为:11001110 10100011;
三字节模式:对于unicode编码在0800-FFFF范围的字符使用三字节编码,具体的转换过程参考单、双字节模式即可;
③解码
从编码的过程可以看出,utf8编码格式针对不同的unicode格式有3中模式,通过其模式的特点就可以划分出两个字符之间的界限,从而完成解码;
以三字节解码为例:

原字符:hello,世界
对这些字符进行UTF8编码,查看其二进制格式:
Hex: 6865 6c6c 6f2c e4b8 96e7 958c
Bin:
‭‭01101000 01100101 01101100 01101100 01101111 00101100
11100100 10111000‬ 10010110 11100111 10010101 10001100‬
接下来,我们就需要用这些二进制串来匹配其unicode码;
以01101000为例,其第一位是0,三种模式中只有单字节模式的首位为0,因此,01101000表示一个单字节,去掉首位后,得到其unicode编码为1101000=104,104在unicode对照表中对应的就是字符h;h后面的5个字节都是这种单字节模式,过程不再赘述;
11100100 10111000‬ 10010110这一串二进制码,首字节以1110开头,因此,根据UTF8的基本规则2,我们可以知道这三个字节是三字节模式。按照规则可以得到其unicode码:01001110 00010110,即19990,通过查找unicode对照表即可知道其对应的字符是’世’,后面一个字符的解码过程不再赘述;

二.GBK和UTF8的相互转换

前面介绍了UTF8和UNICODE两种编码的编解码规则,UTF8是为解决unicode存储问题而出现的。有个问题,GBK和unicode是否有直接的转换规则。答案是没有。因为GBK是针对中文出的编码方式,而Unicode是ISO为了统一世界上所有的编码方式而出现的。因此,unicode制定时并没有兼容GBK,同一个字符在GBK和unicode上面的编码只能通过一一映射对应起来。因此,GBK无法和UTF8直接完成转换,UTF8要转换为GBK,需要先转换为UNICODE,之后再转换为GBK。

附录

参考链接:
彻底搞懂编码ASCII、Unicode、GBK 和 UTF8 、UTF-16、UTF-32编码方式
该博主讲的很细,非常值得一看~~

常见编码格式编码格式转换详解相关推荐

  1. VC常用数据类型使用转换详解

    VC常用数据类型使用转换详解 出  处:PCVC.NET 作  者:程佩君 刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用. 我们先定义一些常见类型变量借以 ...

  2. UNICODE与UTF-8的转换详解

    UNICODE与UTF-8的转换详解 1 编码 在计算机中,各种信息都是以二进制编码的形式存在的,也就是说,不管是文字.图形.声音.动画,还是电影等各种信息,在计算机中都是以0和1组成的二进制代码表示 ...

  3. 由RGB到HSV的转换详解

    由RGB到HSV的转换详解 1RGB色彩空间 在图像处理中,最常见的就是RGB色彩模型.在RGB模型中,每种颜色出现在红.绿.蓝的原色光谱分量中.该模型基于笛卡尔坐标系.如图1所示,RGB原色值位于3 ...

  4. UNICODE与 UTF8的转换详解

    转载请注明出处: http://www.ins1000.cn/KnowledgeActionForReader?action=read&id=104 源文件下载地址:UTF- 8的转换详解(W ...

  5. 常见的java设计模式详解

    常见的java设计模式详解 1. 根据目的来分 2 GoF的23种设计模式的功能 3.下面介绍几种常见的模式 单例(Singleton)模式 前言 1)单例(Singleton)模式的定义 2)特点 ...

  6. UNICODE与 UTF-8 的转换详解

    UNICODE与 UTF-8的转换详解 unicode 只是一种编码方式,而utf-8是unicode的一种保存或传输方式. 1 编码  在计算机中,各种信息都是以二进制编码的形式存在的,也就是说,不 ...

  7. python装饰器函数-Python函数装饰器常见使用方法实例详解

    本文实例讲述了Python函数装饰器常见使用方法.分享给大家供大家参考,具体如下: 一.装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所 ...

  8. PHP中IP地址与整型数字互相转换详解

    这篇文章主要介绍了PHP中IP地址与整型数字互相转换详解,本文介绍了使用PHP函数ip2long与long2ip的使用,以及它们的BUG介绍,最后给出自己写的两个算法,需要的朋友可以参考下 IP转换成 ...

  9. android控件使用大全,Android常见控件使用详解

    本文实例为大家分享了六种Android常见控件的使用方法,供大家参考,具体内容如下 1.TextView 主要用于界面上显示一段文本信息 2.Button 用于和用户交互的一个按钮控件 //为Butt ...

  10. python datetime to timestamp_python timestamp和datetime之间转换详解

    做开发中难免时间类型之间的转换, 最近就发现前端js和后端django经常要用到这个转换, 其中jsDate.now()精确到毫秒,而Python中Datetime.datetime.now()是精确 ...

最新文章

  1. RESTful_URI资源
  2. linux rcs文件中的ip,linux学习笔记之diff和patch命令
  3. ExecuteScalar ExecuteReader ExecuteNonQuery 区别
  4. View - RemoteViews
  5. SharePoint 集成OWA概述
  6. 魏代汉,晋代魏,背后是士族与寒族的博弈,也是士族门阀的形成时期
  7. ABAP中常见的接口技术类型
  8. 一家公司干了8年的程序员的年终总结
  9. 计蒜客可以做计算机编程吗,如果你的编程能力不足以支撑你成为工程师的野心,不妨到计蒜客上学学看...
  10. 深入学习typedef和typename
  11. 完成端口中的单句柄数据结构与单IO数据结构的理解与设计
  12. java hash简易_Java手写简易版HashMap的使用(存储+查找)
  13. 并查集路径压缩_并查集简单教学
  14. 附件文件超过了服务器的大小,Exchange 2010修改附件大小限制
  15. PDF格式分析(九)如何判断PDF / VT
  16. 标准数独游戏-深搜解法
  17. 2020届高考冲刺提分技巧;圆锥曲线系统秒杀技巧
  18. 业务分析师Business Analysist(BA)的职业发展之路
  19. java 某字段重复的数据库,excel表格两个字段去重复的数据库【用JAVA程序向SQL数据库导入Excel表,判断出SQL表中已存在的重复数据,并跳过重复的继续导入其他记录.】...
  20. 迅为6818/4418开发板Yocto开发指南

热门文章

  1. 失去诚信的老板,不会再合作!
  2. 两台电脑怎么直连传输文件呢?
  3. 向日葵远程等桌面时,第三方软件白屏或只有一个框
  4. AssetBundle打包以及游戏更新
  5. visionPro通过网线连接海康相机踩过的坑
  6. Vue的脚手架工具cli安装
  7. mysql查询性别语句_mysql 语句根据身份证查询年龄,地址,性别
  8. 刘顺琦 CSCI 561 midterm3
  9. 酷酷的爆炸效果_Python海龟画图不仅仅是画图
  10. 岭回归(ridge回归)、lasso回归、ElasticNet回归