编码笔记

java中经常会用到编码转换,但是经常会搞混,看了几个大神的解释,加入自己的理解,花了点时间整理下,供查阅。

1、常用编码

目前比较常用的编码有ASCII码,ISO-8859-1,GB2312,GBK,Unicode等
1)ASCII码:仅用计算机的最小存储单位一个字节来标识,即8位,ascii码规定了一个英文字符和二进制位的对应关系,一共规定了128个字符,其中0-31是不能打印的字符,ascii码实际仅占用了后7个二进制位,最高位始终为0;
2)ISO-8859-1
IOS组织在ASCII基础上扩展,低7位仍然是ascii码,利用最高为来表示其余字符,IOS标准有IOS-8859-1 ~ IOS-8859-15,其中1涵盖了大多数西欧字符,应用最广泛,但是还是做多表示256个字符
3)GB2312
GB2312由两个字节组成,涉及到几个概念:
区位码:GB2312将汉字编入94*94的二位表中,行称为区,列称为位,比如一个字在行54,列43 那么它的区位码就是5443
国际码:将区和位上的数字分别加上32(16进制表示就是20H),形成国际码,加上20H的原因是GB2312覆盖了ascii的字母和字符,仅保留了32个不可打印的字符,所以每个区字节和位字节都需要偏移32(就是从33开始).
举个例子:万的区位码是45区82位,转为16进制的区位码是2D52H,加上2020H等于4D72H
机内码:存储中,每个字节无法区分是ascii码还是gb2312,所以微软规定了如果使用gb2312,每个字节的最高为是1,与ascii码区别,最高位设置为1,那么就是将国际码的每个字节加上128(2的7次幂,转为16进制就是每个字节+80H),得到了
机内码=国际码+8080H=区位码+A0A0H
所以万的机内码=2D52H+A0A0H=4D72H+8080H=CDF2H
我们在电脑文本中看到的已经转换的gb2312编码实际上是机内码

4)GBK
是对GB2312的扩展,兼容GB2312,没做过多研究
5)Unicode
unicode 只是符号集,规定了符号的二进制代码,并没有规定如何存储。Unicode有17个平面,每个平面有2^16=65536个Code Point,总共2^16*17=1114112个,所以最后的码位是10FFFF。这个没有详细研究

2. utf-8

unicode的实现方式之一是utf-8,utf-8在实际开发过程中用的最多,所以做了比较详细的记录。
概念:utf-8是一种变长的编码方式,使用1-4个字节标识不同的符号
编码规则
1)对于单字节的符号,第一位为0,后面7位为unicode码,因此对于英文字母,utf-8编码与ascii码一样
2)对n(n>1)个字节的符号,第一个字节前n位是1,第n+1位为0,后面子节点前来两位一律为10,剩余所有位为unicode码
从编码规则来看,如果第一个字节的第一位是0,那么这个字符就占一个字节,如果第一个字节前几位是1,那么就占几个字节
看下utf-8存储字节和unicode的对应范围
1个字节对应的unicode范围是0000 0000-0000 007F
2个字节对应unicode的范围是0000 0080-0000 07FF
3个字节对应unicode的范围是0000 0800-0000 FFFF
4个字节对应unicode的范围是0001 0000-0010 FFFF
这里unicode都用的4个字节来表示,得详细解释下,先说一个字节
1个字节的二进制范围是0000 0000-0111 1111,转为16进制是00-7F,所以4个字节表示unicode就是0000 0000-0000 007F
2个字节,根据编码规则,第一个字节的前三位必须是110,第二个字节的前两位必须是10,那么第一个字节有5位,第二个字节有6位来存储unicode,即开始范围是1100 0010 1000 0000,开始我比较疑惑为什不从1100 0001 1000 0000开始,随后发现,unicode的0 000100 0000实际上在一个字节的表示范围内。结束范围比较好理解,是11011111 10111111,表示unicode的实际只有0111 1111 1111,即7FF,所以2个字节对应的unicode范围是0000 0080-0000 07FF。
3个字节,2个字节实际表示unicode的位数是11,那么三个字节起始表示unicode的是应该是12位,第一位是1 ,即1000 0000 0000(800H),实际存储的字节则为11100000 10100000 10000000,3个字节实际表示unicode的位数是16位(高4+中6+低6),所以3个字节的范围是FFFFH
4个字节起始unicode应该是17位,最高位为1,则起始为10000H,即11110000 10100000 10000000 10000000,4个字节实际表示unicode的有21位,所以最大为1FFFFF,但是unicode的最后码位是10FFFF,所以4个字节表示unicode的范围是0001 0000-0010 FFFF

看图还是更清楚些


image.png

参考网站:
https://blog.csdn.net/zrf2112/article/details/50718684
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351