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. side Effect

    副作用 side Effect 副作用是在计算结果的过程中,系统状态的一种变化,或者与外部世界进行的可观察的交互. 副作用可能包含,但不限于: 1.更改文件系统 2.往数据库里插入数据 3.发送一个h ...

  2. cssText用法和使用说明

    cssText 本质是什么? cssText 的本质就是设置 HTML 元素的 style 属性值. cssText 怎么用? document.getElementById("d1&quo ...

  3. python生成html表格

    最近做一个小工具,需要将统计数据生成html表格.在网上搜罗一圈后发现用pandas生成表格非常好用.代码如下: import pandas as pd def convertToHtml(resul ...

  4. C++:关于委托类

    转自:http://blog.csdn.net/dadalan/article/details/4041931.vs2010已经支持function/bind,能很好实现委托. [说明] 本文不仅介绍 ...

  5. MapReduce优化参数

    资源相关参数 //以下参数是在用户自己的 MapReduce 应用程序中配置就可以生效 (1) mapreduce.map.memory.mb: 一个 Map Task 可使用的内存上限(单位:MB) ...

  6. Toad for MySQL 7.3 Freeware异常 2017-01-09 15:14 115人阅读 评论(0) 收藏

    打开Toad出现如下异常信息: 解决办法: 重装.NET Framework4.0

  7. ubuntu install chrome

    sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/ wget -q -O - h ...

  8. 天地图,js 4.0 api,简单调用,高手请绕行

    本文介绍使用天地图 js4.0 api,实现地图显示后台gps分布情况: 主要借用H5 GPS获取,利用天地图的背景展示: 效果图如下: 第一步,通过采集网页,手机gps数据,录入后台数据库:界面如下 ...

  9. Java -- Arrays.asList()方法

    Arrays.asList() 是将数组作为列表 问题来源于: public class Test { public static void main(String[] args) { int[] a ...

  10. SOJ4389 川大贴吧水王 队列

    描述 _L的室友HZ喜欢在川大贴吧上发帖,据传说,HZ在川大贴吧上发的贴子数已经超过了该贴吧贴子总数的一半,被江湖人封为川大贴吧水王,你能帮_L迅速找出这位川大贴吧水王HZ的ID吗? 已知川大贴吧贴子 ...