Unicode

  Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求Unicode的作用。1990年开始研发,1994年正式公布。

Unicode出现的原因

  在Unicode出现之前,已经存在很多不同的标准了,如美国的ASCII、西欧的ISO 8859-1、俄罗斯的KOI-8、中国的GB 18030和BIG 5等。这样就会产生下面两个问题:一个对于任意给定字符值,在不同的编码方案下有可能对应不同的字母;二是采用大字符集的语言其编码长度有可能不同。例如,有些常用的字符采用单字节编码,而另一些字符则需要两个或更多个字节。

  设计Unicode就是为了解决上面传统的字符编码方案的局限而产生的。在20世纪80年代开始启动设计工作时,人们认为两个字节的代码宽度足以对当时世界上各种语言的所有字符进行编码,并有足够的空间留给未来的扩展(在这里只能说so young so simple,外国人万万想不到我大中华有56个民族吧,万万想不到我们汉文化的博大精深吧,我们不仅有简体字,我们还有繁体字,NB的是我们还有甲骨文,你说就给我们俩字节,这不说升级呢吗?)。

  在1991年发布Unicode1.0版本的时候,当时仅用了65536个代码值中不到一半的部分。当时Java正处于萌芽状态,Java的设计决定采用16为的Unicode字符集,这样会比使用其它8位字符集的程度设计语言有很大的改进。

Unicode爆了

  但好景不长,上面我们所调侃的状态就出现了Unicode字符超出了65536个,现在16为的char已经不能满足描述所有Unicode字符的需要了。

  我们知道字符存储在计算机中是依赖于编码表对其进行的翻译,编码表会找出这个字符在表中对应的数字,然后将这个数字存储在计算机中,这个过程就是编码的过程。当我们读取该字符时,进行一次对照的解码,将数字对应的字符返还给我们,这是解码的过程(所以编码和解码应该使用相同的编码集,否则会产生乱码的情形)。在这里我们要着重介绍的是字符对应编码表中的数字,这个数字就是码点(code point),也叫点代码。码点:是指一个编码表中的某个字符对应的代码值。(了解码点对于以后Java中一些关于码点的方法有帮助)

  在Unicode标准中,码点采用16进制书写,并加上前缀U+,例如U+0041就是拉丁字母A的码点。Unicode为了解决不能满足字符需求的情况,将码点分为了17个代码等级(code plane),0x0000 至 0x10FFFF每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。然而目前只用了少数平面。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。第一个代码等级称为基本的多语言级别(basic multilingual plane),码点从U+0000到U+FFFF,其中就包括了我们常见的经典的Unicode代码,其余的16个码点级别从U+10000到U+10FFFF,其中包括一些辅助字符(supplementary character)。

  上面提到了UTF-16,这是很有必要讲解一下的。UTF-16是Unicode字符编码五层次模型的第三层:字符编码表(Character Encoding Form,也称为 "storage format")的一种实现方式。即把Unicode字符集的抽象码位映射为16位长的整数(即码元)的序列,用于数据存储或传递。Unicode字符的码位,需要1个或者2个16位长的码元来表示,因此这是一个变长表示。

  在基本的多语言级别中,每个字符用16为来表示,通常被称为代码单元(code unit);而辅助字符采用一对连续的代码单元进行编码。这样构成的编码值落入基本的多语言级别中空闲的2048字节内,通常被称作替代区域(surrogate area)【U+D800 ~U+DBFF 用于第一个代码单元,U+DC00~U+DFFF用于第二个代码单元】。这样的设计十分巧妙,可以从中迅速知道一个代码单元是一个字符的编码,还是一个辅助字符的第一或第二部分。例如,下面字符

是一个八元数集的一个数学符号,码点为U+1D546,编码为两个代码单元U+D835和U+DD46。我们通过代码单元可以很容易看出来这是一个辅助字符。

  在Java中使用Unicode作为默认的编码集,char类型描述了UTF-16编码中的一个代码单元(这也就是为什么char需要两个字节的存储空间了)。在Java中强烈建议不在程序中使用char类型,除非确实需要处理UTF-16代码单元。最好将字符串作为抽象数据类型处理。

Knowledge Point 20180305 Java程序员详述编码Unicode的更多相关文章

  1. 聊聊阿里社招面试,谈谈“野生”Java程序员学习的道路

    引言 很尴尬的是,这个类型的文章其实之前笔者就写过,原文章里,笔者自称LZ(也就是楼主,有人说是老子的简写,笔者只想说,这位同学你站出来,保证不打死你,-_-),原文章名称叫做<回答阿里社招面试 ...

  2. JAVA程序员必看的15本书-JAVA自学书籍推荐

    作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水 ...

  3. [转载]一个标准java程序员的进阶过程

    第一阶段:Java程序员 技术名称 内                 容 说明 Java语法基础 基本语法.数组.类.继承.多态.抽象类.接口.object对象.常用类(Math\Arrarys\S ...

  4. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  5. Java程序员应该掌握的10项技能

    这篇文章主要介绍了作为Java程序员应该掌握的10项技能,包括java的知识点与相关的技能,对于java的学习有不错的参考借鉴价值,需要的朋友可以参考下   1.语法:必须比较熟悉,在写代码的时候ID ...

  6. Java程序员岗位

    Java程序员岗位面试题有哪些?   1.面向对象的特征有哪些方面(1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择 ...

  7. 分享下对JAVA程序员成长之路的总结<转>

    我也搞了几年JAVA了,由于一向懒惰,没有成为大牛,只是一普通程序猿,手痒来给新人分享下从新手成长为老鸟的已见.   首先初识语法的阶段,必须要学会怎么操作对象,操作if和for,操作list set ...

  8. Java程序员必须熟知的十项技术

    1.语法 Java程序员必须比较熟悉语法,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正. 2.命令 必须熟悉JDK带的一些常用命令及其常用选项,命 ...

  9. java程序员修炼之道

    今天在论坛里看到了一位工作10年的java大牛总结的java程序员修炼之道,看完后给出的评价是:字字玑珠,深入人心,猛回头,自己一无是处··· 大牛告诉我们应该好好学习与修炼以下知识与技能 Java语 ...

随机推荐

  1. elastic job 动态设置定时任务

    1. 版本 <!-- import elastic-job lite core --> <dependency> <groupId>com.dangdang< ...

  2. filter() 方法创建一个新数组

    filter快速过滤创建一个新数组 var new_array = arr.filter(callback(element[, index[, array]])[, thisArg]) 参数节 cal ...

  3. 基础架构之Docker私有库

    由于项目要容器化,所有搭建自己的镜像库也是很有必要的,不然发到直接使用官方的镜像库,速度绝对能让你头疼,这篇文章就介绍搭建自己的镜像私有库. (一)  环境要求 Centos 7.5.1804 Doc ...

  4. android的系统设置界面

    Intent 的 意图: Intent intent = new Inetnt(Setings); Setings:   1. ACTION_ACCESSIBILITY_SETTINGS : // 跳 ...

  5. C++ virtual inheritance ZZ

       虚继承 是面向对象编程中的一种技术,是指一个指定的基类,在继承体系结构中,将其成员数据实例共享给也从这个基类型直接或间接派生的其它类. 举例来说:假如类A和类B各自从类X派生(非虚继承且假设类X ...

  6. 【NLP_Stanford课堂】情感分析

    一.简介 实例: 电影评论.产品评论是positive还是negative 公众.消费者的信心是否在增加 公众对于候选人.社会事件等的倾向 预测股票市场的涨跌 Affective States又分为: ...

  7. Oracle案例06—— OGG-01098 Could not flush "./dirdat/e1000004383" (error 28, No space left on device)

    一.前言 自从换了新环境,各种问题层出不穷,如果不是之前积累的经验丰富,估计都歇菜了,看来作为数据库全栈工程师(oracle/mysql/sqlserver/sap hana/pg/mongodb/r ...

  8. Hadoop学习---Hadoop的HBase的学习

    Hbase Hbase的特点: Hbase是bigtable的开源的仿制版本 建立在HDFS之上 可靠性,靠性能 大:一个表可以有上亿行,上百万列 面向列:面向列(族)的存储和权限控制,列(族)独立检 ...

  9. 移动端fixed的元素抖动的问题

    工作中发现,给一个元素添加fixed属性,让它固定在窗口某个位置,直接加fposition:fixed属性就能实现这个效果: 在安卓手机上的效果都比较好,但是ios系统的个别浏览器兼容性就不好,如QQ ...

  10. 网络分析 ANP

    在许多实际问题中,各层次内部元素往往是依赖的. 低层元素对高层元素亦有支配作用,即存在反馈. 此时系统的结构更类似于网络结构.网络分析法正是适应这种需要,由AHP延伸发展得到的系统决策方法.   AN ...