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. Python爬虫教程-14-爬虫使用filecookiejar保存cookie文件(人人网)

    Python爬虫教程-14-爬虫使用filecookiejar保存cookie文件(人人网) 上一篇介绍了利用CookieJar访问人人网,本篇将使用filecookiejar将cookie以文件形式 ...

  2. Java基础之Map的遍历

    遍历Map集合,有四种方法:   public static void main(String[] args) { Map<String, String> map = new HashMa ...

  3. 红黑树(R-B Tree)

    R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black). ...

  4. AWS的load balance

    Route53实现了地理上的load balance; ELB实现了region内的load balance CloudFront实现了静态内容的全网加速 ZULh?*;&T(

  5. SQL Server 2016 ->> T-SQL新特性

    1) TRUNCATE表分区而不是整表 CREATE TABLE dbo.TruncatePartitionTest ( PrtCol INT, Col2 ) ) ON [myPS1](PrtCol) ...

  6. 配置spark集群

    配置spark集群 1.配置spark-env.sh [/soft/spark/conf/spark-env.sh] ... export JAVA_HOME=/soft/jdk 2.配置slaves ...

  7. Python学习---重点模块之shelve

    简单示例 import shelve f = shelve.open(r'shelve.txt') f['info'] = {'name':'ftl', 'age':23, 'sex': 'male' ...

  8. error C2027: use of undefined type 'COleDispatchImpl'的解决方法

    解决办法:在资源管理视图中删除CMDTARG.CPP文件,然后重新编译 设置断点后,F5调试运行,调试运行后,然后关编辑器提示保存对CMDTARG.CPP的修改,点了保存,出现error C2027: ...

  9. July 23rd 2017 Week 30th Sunday

    Setting goals is the first step in turning the invisible into the visible. 设定目标是将实现梦想的第一步. If you wa ...

  10. Java中类继承、接口实现的一些要注意的细节问题

    1.接口A和接口B有相同的方法,只是返回值不同,则实现类不能同时实现这两个接口中的方法. 接口A有void C()方法,接口B有int C()方法,则无法同时实现这两个接口. Java为了弥补类单继承 ...