游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

计算机基础今天一次把Unicode和UTF8说清楚

  请点赞关注,你的支持对我意义重大。
  Hi,我是小彭。本文已收录到GitHubAndroidNoteBook中。这里有Android进阶成长知识体系,有志同道合的朋友,关注公众号〔彭旭锐〕带你建立核心竞争力。前言
  在日常开发过程中,UnicodeUTF8并不是很受关注的知识,但在阅读源码或文章时,出现频率很高。如果你没有理解清楚Unicode、UTF8、UTF16和UTF32之前的关系,会带来阅读障碍。在这篇文章里,我将带你理解Unicode字符集的原理,希望能帮上忙。1。什么是字符编码1。1什么是字符?
  字符(Character)是对文字和符号的总称,例如汉字、拉丁字母、emoji都是字符。在计算机中,一个字符由2部分组成:1、用户看到的图画2、字符的编码
  你经常会在很多词语上看到编码这个单词,对初学者来说很容易混淆。今天我列举出编码常见的3层解释,希望能帮助你以后在阅读文章时快速理解作者的意思。含义1作为动词:表示把一个字符转换为一个二进制机器数的过程,这个机器数才是字符在计算机中真实存储传输的格式。例如把A转换为65(ASCII)的动作,就是一个编码动作;含义2作为名词:表示经过编码动作后得到的那个机器数,对于A来说,65(ASCII)就是A的编码(值),有时会称为编号;含义3作为名词:表示把字符转换为机器数的编码方案,例如ASCII编码、GBK编码、UTF8编码。1。2什么是字符集
  字符集(CharacterSet)是多个字符与字符编码组成的系统,由于历史的原因,曾经发展出多种字符集,例如:
  字符集一多起来,就容易出现兼容问题:即同一个字符在不同字符集上对应不同的字符编码。例如,最早的emoji在日本的一些手机厂商创造并流行起来,使得emoji在不同厂商的设备间无法兼容。要想正确解析一个字符编码,就需要先知道它使用的字符编码集,否则用错误的字符集解读,就会出现乱码。想象以下,你发送的一个在女朋友的手机上看到的是另一个emoji,是一件多么可怕的事情。2。认识Unicode字符集2。1为什么要使用Unicode字符集?
  为了解决字符集间互不兼容的问题,包罗万象的Unicode字符集出场了。Unicode(统一码)由非营利组织统一码联盟负责,整理了世界上大部分的字符系统,使得计算机可以用更简单统一的方式来呈现和处理文字。
  Unicode字符集与ASCII等字符集相比,在概念上相对复杂一些。我们需要从2个维度来理解Unicode字符集:编码标准编码格式。2。2Unicode编码标准
  关键理解2个概念:码点字符平面映射:码点(CodePoint):从0开始编号,每个字符都分配一个唯一的码点,完整的十六进制格式是U〔XX〕XXXX,具体可表示的范围为U0000U10FFFF(所需要的空间最大为3个字节的空间),例如U0011。这个范围可以容纳超过100万个字符,足够容纳目前全世界已创造的字符。
  字符平面(Plane):这么多字符并不是一次性定义完成的,而是采用了分组的方式。每一个组称为一个平面,每个平面能够容纳21665536个字符。Unicode一共定义了17个平面:基本多文种平面(BasicMultilingualPlane,BMP):第一个平面,包含最常用的通用字符。当然,基本平面并不是填满的,而是刻意空出一段区域,这个我们下文再说。辅助平面(SupplementaryPlane):剩下的16个平面,包含多种语言的字符。
  完整的unicode码点列表可以参考:unicode。org2。3Unicode编码格式
  Unicode本身只定义了字符与码点的映射关系,相当于定义了一套标准,而这套标准真正在计算机中落地时,则有多种编码格式。目前常见到的有3种编码格式:UTF8、UTF16和UTF32。UTF是英文UnicodeTransformationFormat的缩写,意思是Unicode字符转换为某种格式。
  别看编码格式五花八门,本质上只是出于空间和时间的权衡,对同一套字符标准使用不同的编码算法而已。举个例子,字符A的Unicode码点和编码如下:1、图像:A2、码点:U00413、UTF8编码:0X414、UTF16编码:0X00415、UTF32编码:0X00000041
  当你根据UTF8、UTF16和UTF32的编码规则进行解码后,你将得到什么结果呢?是的,它们的结果都是一样的0x41。懂了吗?3。Unicode的三实现方式
  这一节,我们来讨论Unicode最常见的三种编码格式。3。1UTF32编码
  UTF32使用4个字节的定长编码,前面说到Unicode码点最大需要3个字节的空间,这对于4个字节UTF32编码来说就绰绰有余。缺点:任何一个码点编码后都需要4个字节的空间,每个字符都会浪费13个字节的存储空间;优点:编解码规则最简单,编解码效率最快。
  UTF32编码举例U00000x00000000U6C380x00006C38U10FFFF0x0010FFFF3。2UTF16编码
  UTF16是2个字节或4个字节的变长编码,结合了UTF8和UTF32两者的特点。前面提到Unicode码点最大需要3个字节,那么当UTF16使用2个字节空间时,岂不是不够用了?
  先说UTF16的编码规则:规则1:基本平面的码点(编号范围在U0000UFFFF)使用2个字节表示。辅助平面的码点(编号范围在U10000U10FFFF的码点)使用4个字节表示;规则2:16个辅助平面总共有220个字符,至少需要20位的空间才能区分。UTF16将这20位拆成2半:高10位映射在UD800UDBFF,称为高位代理(highsurrogate);低10位映射在UDC00UDFFF,称为低位代理(lowsurrogate)。
  好复杂,为什么要这么设计?第一条规则比较好理解,1个平面有最大的编码是UFFFF,需要用16位表示,用2个字节表示正好。第二条规则就不好理解了,我们重点说一下。
  辅助平面最大的字符是U10FFFF,需要使用21位表示,用4个字节表示就绰绰有余了,例如说低16位放在低16位,高5位放在高16位(不足位补零)。这样不是很简单也很好理解?
  不行,因为前缀有歧义。这种方式会导致辅助平面编码的每2个字节的取值范围都与基本平面的取值范围重复,因此,解码程序在解析一段UTF16编码的字符流时,就无法区分这2个字节是属于基本平面字符,还是属于辅助平面字符。
  为了解决这个问题,必须实现前缀无歧义编码(PFC编码,类似的还有哈弗曼编码)。UTF16的方案是将用于基本平面字符编码的取值范围与辅助平面字符编码的取值范围错开,使得两者不会出现歧义(冲突)。这么做的前提,就需要在基本平面中提前空出一段区域,这就是上文提到基本平面故意空出一段区域的原因。
  如下图所示,在基础平面中,浅灰色的D8DF为UTF16代理区:
  图片引用自维基百科
  UTF16编码举例
  到这里,UTF16的设计思路就说完了,下面就会解释具体的计算规则,不感兴趣可以跳过。1、辅助平面字符的范围是U10000U10FFFF,换句话说,第一个辅助平面字符是U10000。那么就可先把每个码点减去0x10000,映射到U0000U0AFFFF,这样的好处是只需要20位就能表示所有辅助平面字符(否则需要21位);2、20位正好可以拆分为2组:高10位作为一组,低10位作为一组,则有codepointhigh10low0x100003、high和low会与基本平面冲突,那么就给它们分别加上一个偏移量,使它们落到基本平面中空出来的代理区(high偏移0xD800,low偏移0xDC00)。
  至此,UTF16字符编码完成。计算公式总结:
  codepoint((high0xD800)10)low0xDC000x10000
  high(codepoint0x10000)100xD800
  low(codepoint0x3FFF)0xDC00w
  我们在Java源码中寻找一下这套计算规则,具体在String和Character中:
  String。javapublicString(int〔〕codePoints,intoffset,intcount){0。前处理:参数不合法的情况finalintendoffsetcount;1。计算总共需要的char数组容量intncount;for(intioffset;iend;i){intccodePoints〔i〕;分析点1。1if(Character。isBmpCodePoint(c))continue;分析点1。2elseif(Character。isValidCodePoint(c))n;每个辅助平面字符需要多一个charelsethrownewIllegalArgumentException(Integer。toString(c));}2。分配数组并填充数据finalchar〔〕vnewchar〔n〕;for(intioffset,j0;iend;i,j){intccodePoints〔i〕;分析点2。1if(Character。isBmpCodePoint(c))v〔j〕(char)c;else分析点2。2Character。toSurrogates(c,v,j);}结束this。valuev;}
  编码计算:
  Character。java分析点1。1:判断码点是否处于基本平面publicstaticbooleanisBmpCodePoint(intcodePoint){returncodePoint160;}分析点1。2:判断码点是否处于辅助平面publicstaticbooleanisValidCodePoint(intcodePoint){intplanecodePoint16;returnplane((0x10FFFF1)16);}分析点2。2:辅助平面字符规则2staticvoidtoSurrogates(intcodePoint,char〔〕dst,intindex){high在高位,low在低位,是大端序dst〔index1〕lowSurrogate(codePoint);dst〔index〕highSurrogate(codePoint);}计算高位代理publicstaticcharhighSurrogate(intcodePoint){return(char)((codePoint10)(0xDBFF(0x01000010)));}计算低位代理publicstaticcharlowSurrogate(intcodePoint){return(char)((codePoint0x3ff)0xDC00);}
  解码计算:
  Character。javapublicstaticinttoCodePoint(charhigh,charlow){源码有算术表达式优化,此处为等价逻辑return((high0xD800)10)(low0xDC00)0x010000;}3。3UTF8编码
  UTF8是14个字节的变长编码,相对来说最节省空间。下述规则表述与你在任何文章百科里看到的规则表述不一样,但是逻辑上是一样的。因为我认为按照前缀无歧义的概念来理解最易懂。规则1:不同范围的码点值使用不同长度的编码;规则2:字节编码总长度为1时前缀为0、总长度为2时前缀为110、总长度为3时前缀为1110、总长度为4时前缀为11110;规则3:除了首个字节,字符编码中其余字节的前缀为10。
  可以看到,这种编码方式是不会存在前缀歧义的,也比较好理解。
  UTF8编码举例
  因为UTF8编码相对来说是最节省空间的,因此在很多存储和传输的场景中,都会选择使用UTF8编码。例如:1、XML文件的编码:在文件头定义了编码格式。lt;?xmlversion1。0encodingutf8?2、Java字节码中字符串常量的编码:可以看到,Class文件中的字符串常量是UTF8编码的,并且长度最大只支持u2(65535个字符),这就是在Java中定义的变量名标识符或方法名标识符过长(超过64KB)将无法通过编译的根本原因。
  类型标识描述CONSTANTUtf8info1UTF8编码的字符串CONSTANTStringinfo8字符串类型字面量
  其中CONSTANTUtf8info常量的结构:
  名称类型数量tagu11lengthu21bytesu1length3、HTTP报文主体的编码:HTTP报文首部字段ContentType可以指定字符编码方式。在OkHttp源码中,当响应报文首部字段ContentType缺省时,默认按UTF8解码,看源码:
  Http报文示例HTTP1。1200OK。。。省略ContentType:texthtml;charsetUTF8〔报文主体〕
  OkHttp源码摘要:
  ResponseBody。javapublicfinalStringstring()throwsIOException{BufferedSourcesourcesource();try{分析点1CharsetcharsetUtil。bomAwareCharset(source,charset());returnsource。readString(charset);}finally{Util。closeQuietly(source);}}分析点1:获得解码需要的charsetprivateCharsetcharset(){contentType为null时,使用UTF8MediaTypecontentTypecontentType();returncontentType!null?contentType。charset(UTF8):UTF8;}参考资料Unicode维基百科UTF8,atransformationformatofISO10646互联网工程任务组(IETF)UTF16,atransformationformatofISO10646互联网工程任务组(IETF)UnicodeFormatforNetworkInterchange互联网工程任务组(IETF)《编码隐匿在计算机软硬件背后的语言》(第23章)〔美〕CharlesPetzold著隔空传情:emoji简史GooglePlay字符编码笔记:ASCII,Unicode和UTF8阮一峰著Unicode与JavaScript详解阮一峰著阮一峰老师文章的常识性错误之Unicode与UTF8刘志军著

西藏自驾游第八天第八天7月28日乡城德荣德钦(入滇藏线)12小时,300公里早餐酒店的正宗酥油茶。8:20从乡城县城出发,修路。乡城早晨,仙境。3800多米海拔。再回首……2022年我大癌股依然是牛市第一,虎年还没有开始第二,最近时期的股市暴跌,是为牛市重新选赛道,腾空间。第三,股市的思路变了,各种茅的机构抱团股会瓦解。大盘蓝筹股可能会有长期的走下降通道中,比如……2021年科技圈最难题,高通骁龙888这颗火龙最终将被降服?大概是去年这个时候,科技圈都在关注这么一件事,那就是高通骁龙高端芯片什么时候发布呢?结果2020年12月1日,高通正式宣布了新一代高端芯片骁龙888的发布,以888命名,这无疑……孩子自卑紧张不愿意上学,家长该怎么办?文韩海英Q老师您好!我女儿现在上五年级,11周岁,心理测试发现有厌学的情绪、不想上课、想逃课等状况。她总是语言表达不顺畅,背课文也会受到影响,导致有些自卑。我们夫妻……华为MateX3曝光搭载麒麟90004G芯片运行鸿蒙OS2。IT之家3月24日消息,近期,一款型号为PALAL00的华为4G新机通过了工信部入网审核,运行HarmonyOS,爆料称,这就是华为MateX3折叠屏手机,预计华为将于今年上半……惠州供电聚焦服务千亿园区,助力惠州经济增速领跑全省惠州是粤港澳大湾区重要节点城市、广东省万亿工业大市。近年来,惠州以实体经济为本,坚持制造业当家,依托大项目支撑大产业,依托大产业推动大发展。今年前三季度,惠州交出优异的经济成绩……奇袭白虎团还有一支神勇的小分队,战斗惊险激烈,毙敌200多人说起抗美援朝战争中我军侦察排副排长杨育才和化袭班英雄们奇袭白虎团团部的战斗,很多朋友都不会陌生。其实,歼灭南朝鲜军白虎团的战斗,是一次系统性很强的大规模战役性作战行动。在这次战……拯救者Y70美图赏析纤薄身姿下的炸裂能量在大家的刻板印象里,电竞手机差不多都是那种较为夸张炫酷的,比如拯救者Y90,整体造型就特别刚猛,狂战士一般。但最近,拯救者Y70的到来让人家眼前一亮,它的造型纤薄多姿,简约大气……又见超大罚单!泄露5。33亿用户隐私,Meta被罚2。65亿近日,Meta被爱尔兰数据保护委员会(DPC)罚款2。65亿欧元,原因是2021年Facebook遭遇爬虫攻击发生大规模数据泄露,暴露了全球数亿用户的个人信息。2021年……一米长的根据是什么?要是有人问:一米有多长?你会不假思索地回答:三市尺;或者说:3。2808英尺。但是如果寻根究底,一米是根据什么制定的?恐怕一些人就答不上来。早在法国大革命后(1799年左……月线分析个股交流(20230213)今日案例分析属于商业连锁版块,这个标的在国内商业连锁里属于百强企业,省级龙头,这两年受疫情的影响,很多行业都很不容易,现金流受到很大的冲击,随着国内的好转,相信所有的这一切都将……大瓜!已婚国脚疑似婚外恋被曝光!曾是李铁爱将,顶替归化首发过北京时间1月18日,几天前在球场上大喊吴兴涵骗钱骗感情的某女子晒出图片,疑似她与吴兴涵两人曾一起浪漫的度过了不短的时光。而今年30岁的吴兴涵,早已结婚,孩子已经不小。世预……
身上有味,社交尴尬?中老年朋友少吃这3种食物,避免身体异味中来年朋友在生活中可能会有这样的难以启齿的烦恼,那就是身上总是有一股奇怪的味道。当然,普通的汗臭味可以通过勤洗澡和勤换衣物来解决,但来自身体内部的怪味却总是难以消除。近年来常被……生涯新高!快船高富帅打出身价,娶到1米8白富美NBA常规赛,快船队客场以9998险胜火箭队。本场比赛,快船队首发中锋伊维察祖巴茨发挥出色,全场出战34分钟,投篮5投5中,砍下14分15篮板(4个前场篮板11个后场篮板)3助……喝绿茶不舒服真的是因为寒吗?关注我每天分享知识喝绿茶不舒服真的是寒吗?绿茶不舒服其实不是。因为绿茶很寒什么的。其实是因为绿茶里面的植酸、柔酸还有咖啡碱,它对我们的胃黏膜会产生刺激,就会令到你的胃酸就会大量的分泌,那你……OPPO一加Ace系列发展史超级玩家【1】OPPORenoAce搭载骁龙855Plus处理器,采用台积电7nm的工艺制程,性能表现十分出色正面是一块6。5英寸的三星E3发光材料的直屏,支持90Hz的刷……前山东首富,第2家公司要上市了,山东民企10强,为何5家没有文丛树来源鲁商儒风10月19日,一家名为歌尔微的公司,通过了创业板上市委的审议。这家公司有一个让人更容易理解的名字歌尔微电子。它是歌尔股份分拆出来的子公司。这……中国一大批富二代,活成了精致废物作者:柳展雄,关注新兴行业,《新京报》《经济观察报》专栏作者最近中国顶流富二代王思聪,又有了新动静,王思聪不再担任万达集团董事。国家企业信用信息公示系统显示,大连万达集团……羊城最美春花风铃木全城刷屏粉红娇媚的风铃木是花城春天的当下大热。原来风铃木不仅只有亮黄色。步入花期的紫花风铃木红粉菲菲,树冠被密集的花朵染成片,落花在地上铺成粉红的地毯,相互辉映的让人目不暇接。华……5个步骤解决鼻子痤疮点击上方关注广州云云诊所与你分享皮肤美容抗衰年轻化鼻子上的粉刺是女孩疼痛的主要原因。因为它比其他位置更痛苦,所以很难治愈,而且位置明确。对于那些鼻子上经常长痘痘的人……各品牌值得买手机推荐这么买不出错,直接抄作业!2023年2月各品牌值得买手机有哪些?如果你计划给自己、家人换机,那么以下机型入手不亏。一:苹果iPhone12以上机型都是可以考虑的,看中性价比选iPhone13……续航401km!几何E价格不高,设计时尚,冬日能跑多远?汽车升级带来的好处就是能让我们以更低的价格购买到一辆用车成本低,造型亮眼,并且配置丰富的汽车。如果原先你只有八九万元的预算,购买到的新车种类其实并不多,比如经典版的轩逸或者低配……人过五十,善待自己,活好每一天50岁的人,不再年轻了,吃过很多苦,挨过许多累,各种各样的疾病都找上门来了。50岁还是个尴尬的年纪,你说老吧,其实也不算太老,可是相对于40岁,确确实实体力上大不如从前了……朋友,你快要吃不起土了常年吃土的壹读君丨彤云俗话说:不干不净,吃了没病。最近,一项发表于《自然化学》的研究,表明不干不净甚至有益身体健康适量吃土能治疗肠炎。当然,实验中吃的土是安全……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网