Knowledge Point 20180305 Java程序员详述编码Unicode
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的更多相关文章
- 聊聊阿里社招面试,谈谈“野生”Java程序员学习的道路
引言 很尴尬的是,这个类型的文章其实之前笔者就写过,原文章里,笔者自称LZ(也就是楼主,有人说是老子的简写,笔者只想说,这位同学你站出来,保证不打死你,-_-),原文章名称叫做<回答阿里社招面试 ...
- JAVA程序员必看的15本书-JAVA自学书籍推荐
作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水 ...
- [转载]一个标准java程序员的进阶过程
第一阶段:Java程序员 技术名称 内 容 说明 Java语法基础 基本语法.数组.类.继承.多态.抽象类.接口.object对象.常用类(Math\Arrarys\S ...
- Java程序员应该了解的10个面向对象设计原则
面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...
- Java程序员应该掌握的10项技能
这篇文章主要介绍了作为Java程序员应该掌握的10项技能,包括java的知识点与相关的技能,对于java的学习有不错的参考借鉴价值,需要的朋友可以参考下 1.语法:必须比较熟悉,在写代码的时候ID ...
- Java程序员岗位
Java程序员岗位面试题有哪些? 1.面向对象的特征有哪些方面(1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择 ...
- 分享下对JAVA程序员成长之路的总结<转>
我也搞了几年JAVA了,由于一向懒惰,没有成为大牛,只是一普通程序猿,手痒来给新人分享下从新手成长为老鸟的已见. 首先初识语法的阶段,必须要学会怎么操作对象,操作if和for,操作list set ...
- Java程序员必须熟知的十项技术
1.语法 Java程序员必须比较熟悉语法,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正. 2.命令 必须熟悉JDK带的一些常用命令及其常用选项,命 ...
- java程序员修炼之道
今天在论坛里看到了一位工作10年的java大牛总结的java程序员修炼之道,看完后给出的评价是:字字玑珠,深入人心,猛回头,自己一无是处··· 大牛告诉我们应该好好学习与修炼以下知识与技能 Java语 ...
随机推荐
- 合并excel的多个sheet
'合并excel的多个sheetSub 合并当前工作簿下的所有工作表()Application.ScreenUpdating = FalseFor j = 1 To Sheets.Count If S ...
- Java的Final和C#的Const,Readonly比较分析(转载)
Java里面没有readonly关键字,预留了const的关键字,目前还没有实际用途,在Java中,跟这两个关键字比较接近的是final; C#中,两者都存在并可用.两者修饰的全局变量或局部变量都不能 ...
- ArcEngnine中IHookHelper的用法
一.IHookHelper 主要在用在自定义类型于AE带的的ICommand或ITool等 1.实例化IHookHelper 对象:IHookHelper m_hookHelper = new Hoo ...
- makefile 模板 (template)
本文把makefile 分成了三份:生成可执行文件的makefile,生成静态链接库的makefile,生成动态链接库的makefile. 这些makefile都很简单,一般都是一看就会用,用法也很容 ...
- windows下编译基于nginx插件的rtmp流媒体服务nginx-rtmp
1 概述 rtmp流媒体服务器,开源方案有多种,包括srs,red5,crtmpserver,fms,nginx插件等.本文描述了基于nginx插件的方式来实现rtmp流媒体服务器nginx-rtmp ...
- CSS animation online生成工具
利用HTML5.css的一些动画功能,可以设计出非常炫酷的动画,但是由于并不是所有的浏览器都支持,所以可能需要prefix,这个过程是比较烦的.一个比较好用的线上工具: http://matthewl ...
- 【Leetcode】【Medium】Reorder List
Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do thi ...
- cnpm install 之后 Angular2 Build --prod 报错
95% emittingUnhandled rejection Error: ENOENT: no such file or directory, open 'E:\git_0.28\adminTem ...
- python 面向对象:类,作用域
类(Class)和实例(Instance) 定义类是通过class关键字:class Student(object): pass class后面紧接着是类名,即Student接着是(object),表 ...
- Graph 133. Clone Graph in three ways(bfs, dfs, bfs(recursive))
Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...