Unicode代码点与编码方式

一、Unicode字符集

  UTF编码,全称是Unicode Transformer Format,这种编码是UCS(Universal Mutiple-Octet Doded Character Set,国际标准ISO10646规定的通用字符集)的实际形式,它的分类是按照其基本长度所占用的位数而定,分为UTF-8/16/32三种形式。UTF可以说是其他字符集的集合,它使得其它字符集是交叉兼容的,可以说,凡是将文字符号转为UCS后再转回原来的编码,也不会丢失信息。UCS包含了现在所有的已知语言的字符,包含从拉丁文、希腊语到中文、韩文等象形文字,再到日文的平假名、片假名等众多语系 。因此使用UTF进行程序开发,绝对是程序国际化的首选,Unicode将世界的语言统一起来,构成了最伟大的字符集。

二、代码点与代码单元

  代码点和代码单元,是从Unicode标准而来的术语,Unicode标准的核心是一个编码字符集。

  代码点 Code Point:与一个Unicode编码表中的某个字符对应的代码值。

  代码单元 Code Unit:一个Java中的char,可以理解为字符编码的一个基本单元。

三、编码方式

  Unicode编码空间从U+000000到U+10FFFF,Unicode4.0将字符分配给这1112064个代码点中的96382个代码点。

  Unicode的编码空间划为17个平面,每个平面包含216(65536)个码位。17个平面码位可表示为“U+xx0000”到“U+xxFFFF”(xx表示十六进制从0x00到0x10,共计17个平面)。

  从U+000000至U+00FFFF之间的字符称为基本多文种平面(BMP)。这是16位编码的原始标准,早期由于错误地估算了代码点的容量范围,认为Unicode最多只需要2^16个代码点。

  其他平面为辅助平面,也就是代码点在U+10000至U+10FFFF范围之间的字符,又称为增补字符,也就是那些使用原始的Unicode的16位设计无法表示的字符。

四、Unicode在Java中的表示

  Java中用char来表示Unicode字符,由于刚开始Unicode最多使用16bit表示。因此char能够表示全部的Unicode字符。后来由于Unicode4.0规定Unicode支持的字符远远超过65536个字符。因此char现在不能表示所有的unicode字符。仅仅能表示0x000000到0x00FFFF之间的字符。也就是说,char不能表示增补字符。

  Java中用int表示所有Unicode代码点。int的21个低位(最低有效位)用于表示Unicode代码点,并且11个高位(最高有效位)必须为零。也就是说,int能表示出char不能表示的增补字符。

五、UTF-8、UTF-16、UTF-32

  UTF,是Unicode代码点的实际表示方式,按其基本长度所用位数分为UTF-8/16/32。它也可以认为是一种特殊的外部数据编码,但能够与Unicode代码点做一一对应。

  UTF-8是变长编码,每个Unicode代码点按照不同范围,可以有1-3字节的不同长度。是压缩的Unicode编码方式.

  UTF-16长度相对固定,只要不处理大于\U200000范围的字符,每个Unicode代码点使用16位即2字节表示,超出部分使用两个UTF-16即4字节表示。按照高低位字节顺序,又分为UTF-16BE/UTF-16LE。

  UTF-32长度始终固定,每个Unicode代码点使用32位即4字节表示。按照高低位字节顺序,又分为UTF-32BE/UTF-32LE。

  UTF编码有个优点,即尽管编码字节数不等,但是不像gb2312/gbk编码一样,需要从文本开始寻找,才能正确对汉字进行定位。在UTF编码下,根据相对固定的算法,从当前位置就能够知道当前字节是否是一个代码点的开始还是结束,从而相对简单的进行字符定位。不过定位问题最简单的还是UTF- 32,它根本不需要进行字符定位,但是相对的大小也增加不少。

  UTF-32 即将每一个 Unicode 代码点表示为相同值的 32 位整数。很明显,它是内部处理最方便的表达方式,但是,如果作为一般字符串表达方式,则要消耗更多的内存。

  UTF-16 使用一个或两个未分配的 16 位代码单元的序列对 Unicode 代码点进行编码。值 U+0000 至U+FFFF 编码为一个相同值的 16位单元。增补字符编码为两个代码单元,第一个单元来自于高代理范围(U+D800 至U+DBFF),第二个单元来自于低代理范围(U+DC00至 U+DFFF)。这在概念上可能看起来类似于多字节编码,但是其中有一个重要区别:值U+D800 至 U+DFFF 保留用于 UTF-16;没有这些值分配字符作为代码点。这意味着,对于一个字符串中的每个单独的代码单元,软件可以识别是否该代码单元表示某个单单元字符,或者是否该代码单元是某个双单元字符的第一个或第二单元。这相当于某些传统的多字节字符编码来说是一个显著的改进,在传统的多字节字符编码中,字节值 0x41 既可能表示字母“A”,也可能是一个双字节字符的第二个字节。

  UTF-8 使用一至四个字节的序列对编码 Unicode 代码点进行编码。U+0000 至U+007F 使用一个字节编码,U+0080至 U+07FF 使用两个字节,U+0800 至 U+FFFF使用三个字节,而U+10000 至 U+10FFFF 使用四个字节。UTF-8 设计原理为:字节值 0x00 至0x7F 始终表示代码点U+0000 至 U+007F(Basic Latin 字符子集,它对应 ASCII 字符集)。这些字节值永远不会表示其他代码点,这一特性使 UTF-8 可以很方便地在软件中将特殊的含义赋予某些 ASCII 字符。

  下表所示为几个字符不同表达方式的比较:


Unicode 代码点


U+0041


U+00DF


U+6771


U+10400


表示字形


A


?



??(char无法识别)


UTF-32 代码单元


00000041


000000DF


00006771


00010400


UTF-16 代码单元


0041


00DF


6771


D801


DC00


UTF-8 代码单元


41


C3


9F


E6


9D


B1


F0


90


90


80

时间: 2024-08-26 14:52:51

Unicode代码点与编码方式的相关文章

刨根究底字符编码之十——Unicode字符集的字符编码方式CEF以及码点、码元

Unicode字符集的字符编码方式CEF以及码点.码元 一.字符编码方式CEF的选择 1. 由于Unicode字符集非常大,有些字符的编号(码点值)需要两个或两个以上字节来表示,而要对这样的编号进行编码,也必须使用两个或两个以上字节. 比如,汉字"严"的Unicode码(Unicode码点值.Unicode编号)是十六进制数4E25,转换成二进制数有15位(100 1110 0010 0101),对"严"这个字符的编号进行编码的话,至少需要2个字节.表示其他更大编号

Unicode 字符集与它的编码方式

正式内容開始之前,我们先来了解一个基本概念,编码字符集. 编码字符集:编码字符集是一个字符集,它为每个字符分配一个唯一数字.Unicode 标准的核心是一个编码字符集,字母"A"的编码为 004116 和字符""的编码为 20AC16.Unicode 标准始终使用十六进制数字,并且在书写时在前面加上前缀"U+",所以"A"的编码书写为"U+0041". 1 ASCII码 我们知道,在计算机内部,全部的信息

刨根究底字符编码之十三——UTF-16编码方式

UTF-16编码方式 1. UTF-16编码方式源于UCS-2(Universal Character Set coded in 2 octets.2-byte Universal Character Set).而UCS-2,是早期遗留下来的历史产物. UCS-2将字符编号(即码点值)直接映射为字符编码(CEF,而非CES,详见前文中对现代字符编码模型的解释),亦即字符编号就是字符编码,中间没有经过特别的编码算法转换.因此,从现代字符编码模型的角度来看的话,此时并没有将编号字符集CCS与字符编码

ASCII、GBK、Unicode和UTF-8字符编码的区别联系

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为”字节“.再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为”计算机“. 开始计算机只在美国用.八位的字节一共可以组合出256(2的8次方)种不同的状态. 他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端.打印机遇上约定好的这些字节被传过来时,就要做

win、py、notepad++的编码方式及问题

win.py.notepad++的编码方式及问题 先说结论: 因为win的cmd默认使用的编码方式是gbk(ANSI) 所以遇到bat或者python中的中文需要在cmd中print显示时,如果出现乱码,首先需要检查是否因为不是 1. gbk编码的中文或2. 在代码中被转换为gbk编码或3. 在python代码中是unicode对象. 别在win下用自带的文本文档编辑器打开utf-8编码的文件并保存,因为win默认会在utf-8编码的内容中加BOM,只是查看还没问题因为不保存不会自动加BOM,但

刨根究底字符编码之十一——UTF-8编码方式与字节序标记

UTF-8编码方式与字节序标记 一.UTF-8编码方式 1. 接下来将分别介绍Unicode字符集的三种编码方式:UTF-8.UTF-16.UTF-32.这里先介绍应用最为广泛的UTF-8. 为满足基于ASCII.面向字节的字符处理的需要,Unicode标准中定义了UTF-8编码方式.UTF-8应该是目前应用最广泛的一种Unicode编码方式(但不是最早面世的,UTF-16要早于UTF-8面世).它是一种使用8位码元(即单字节码元)的变宽(即变长或不定长)码元序列的编码方式. 由于UTF-16对

编码方式

一 1.unicode只是一种编码方式.  ASCII码:127个数字: 对应7个比特位----> 美国--占1个字  节  扩展ASCII码:256个数字:8个比特位------>拉丁--占1个字  节  中文扩展ASCII码(GB2312): 几千个状态---->中国--占2个  字节  中文扩展ASCII码(GBK):两万多个状态-----中国---占1个字  节  Unicode(万国码):---六七万个字节---全世界----都是2个  字节  UTF8(美国人伤不起,在万国码

字符的编码方式

1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出 256种状态,这被称为一个字节(byte).也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从 0000000到11111111. 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定.这被称为ASCII码,一直沿用至今. ASCII码一共规定了128个字符的

如何使用Java代码获取文件、文件流或字符串的编码方式

今天通过网络资源研究了一下如何使用Java代码获取文件.文件流或字符串的编码方式,现将代码与大家分享: package com.ghj.packageoftool; import info.monitorenter.cpdetector.io.ASCIIDetector; import info.monitorenter.cpdetector.io.ByteOrderMarkDetector; import info.monitorenter.cpdetector.io.CodepageDete