Unicode_unicode 代码 大于0x10000-程序员宅基地

技术标签: 编码  unicode  其他  

Unicode


UCS-2用两个字节编码,UCS-4用4个字节编码。Unicode以UCS-2标准编码字符时可以编码2的16次方个字符,中文中常用的汉字也就几千个,这对于常用的字符已经够用。但若要编码所有字符,UCS-4才能满足。

目前的Unicode字符分为17组编排,0x0000 至 0x10FFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。然而目前只用了少数平面。UCS-4根据最高位为0的最高字节分成27=128个group。每个group再根据次高字节分为256个平面(plane)。每个平面根据第3个字节分为256行 (row),每行有256个码位(cell)。group 0的平面0被称作BMP(Basic Multilingual Plane)。如果UCS-4的前两个字节为全零,那么将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。每个平面有216=65536个码位。Unicode计划使用了17个平面,一共有17×65536=1114112个码位。 在Unicode 5.0.0版本中,已定义的码位只有238605个,分布在平面0、平面1、平面2、平面14、平面15、平面16。最常用的是0平面,ASCII码在0平面的开始部分。中日韩统一表意文字在 4E00-9FFF之间。详细的编码表可以看 Unicode字符百科。


UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。


UTF-8

UTF-8将一个Unicode代码点拆分为多个代码单元存储,每个代码单元是一个字节。具体的对应关系如下表:

Unicode编码(十六进制) UTF-8 字节流(二进制)
00000000-0000007F 0xxxxxxx
00000080 - 000007FF 110xxxxx 10xxxxxx
00000800 - 0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
00010000 - 001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
00200000 - 03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
04000000 - 7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

实际上utf-8对于0x10FFFF以后的编码还用不到,因为目前Unicode字符集并没有那么多。对于不同范围的Unicode字符,utf-8的编码长度不同,对于常用的00000000-0000007F。utf-8的一个字节即对应一个字符。相对于utf-16和utf-32更节约空间。

例1:“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使用用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89

UTF-16

对于代码点小于0x10000(即0平面的Unicode字符),utf-16与Unicode字符集一一对应,两个字节对应一个一个字符。

对于代码点大于0x10000(即0平面以外的Unicode字符),utf-16将用四个字节对应一个代码点:110110yyyyyyyyyy 110111yyyyyyyyyy。设要编码代码点为U,U1=U-0x10000。将计算得到的U1转换为二进制代替格式中的y便是utf-16对这个代码点的编码。

例2:Unicode编码0x20C30,减去0x10000后,得到0x10C30,写成二进制是:0001 0000 1100 0011 0000。用前10位依次替代模板中的y,用后10位依次替代模板中的x,就得到:1101100001000011 1101110000110000,即0xD843 0xDC30。

为了将一个字符的UTF-16编码与两个字符的UTF-16编码区分开来,Unicode编码的设计者将0xD800-0xDFFF保留下来,并称为代理区(Surrogate):

. . .
D800-DB7F High Surrogates 高位替代
DB80-DBFF High Private Use Surrogates 高位专用替代
DC00-DFFF Low Surrogates 低位替代

Java采用的就是utf-16编码

UTF-32

utf-32采用四个字节编码Unicode的一个代码点,所以足够表示所有Unicode,不需要转换。

字节序

对于编码后的字符如何存储。如0x1234 ,是12 34 还是34 12?

字节序有两种,分别是“大端”(Big Endian, BE)和“小端”(Little Endian, LE)。

根据字节序的不同,UTF-16可被实现为UTF-16LE或UTF-16BE,UTF-32可被实现为UTF-32LE或UTF-32BE。

Unicode编码 UTF-16LE UTF-16BE UTF32-LE UTF32-BE
0x006C49 49 6C 6C 49 49 6C 00 00 00 00 6C 49
0x020C30 43 D8 30 DC D8 43 DC 30 30 0C 02 00 00 02 0C 30



计算机如何知道这一系列数字采用哪种方式编码?

Unicode标准建议用BOM(Byte Order Mark)来区分字节序,即在传输字节流前,先传输被作为BOM的字符“零宽无中断空格”。这个字符的编码是FEFF,而反过来的FFFE(UTF-16)和FFFE0000(UTF-32)在Unicode中都是未定义的码位,不应该出现在实际传输中。
下表是各种UTF编码的BOM:

UTF编码 Byte Order Mark (BOM)
UTF-8 without BOM
UTF-8 with BOM EF BB BF
UTF-16LE FF FE
UTF-16BE FE FF
UTF-32LE FF FE 00 00
UTF-32BE 00 00 FE FF

如果想直观的查看不同编码的区别,可以通过记事本或其它编辑器创建多个不同编码(utf-8,utf-16 with BOM,utf-32,ASCII等)的文本文档,先存储一个英语字母,查看每个文件的大小。然后增加一个字母,查看文件大小变化。或者通过某些软件直接读取文本文档的底层代码,转换成十六进制就可以看出不同编码文档开头的不同标识信息。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dcoder3x/article/details/51476501

智能推荐

芯片解密STM8S903K3/STM8S003F3破解意法单片机程序提取_stm8s003f3程序提取-程序员宅基地

文章浏览阅读8.8k次。原文地址::http://blog.sina.com.cn/s/blog_148f658a00102vqdd.htmlSTM8S系列芯片解密已成为了热门行业,本工作室长期研究并提供各种型号STM8S系列芯片解密。不仅解密速度快,当天提供芯片解密后的程序,并可提供STM8S系列芯片解密后的反汇编。  ◆芯片简介  意法半导体(ST)再次扩大8位微控制器的产品阵_stm8s003f3程序提取

在 CentOS 1804 中 修改 MySQL 密码策略-程序员宅基地

文章浏览阅读466次。相关链接:在 CentOS 1804 中 使用 yum 安装 MySQL 5.7 最新版在 CentOS 1804 中 安装 MySQL 5.7.20 (或任意MySQL版本)在 CentOS 1804 中 修改 MySQL 密码策略在 CentOS 中 开启 MySQL 的 3306 端口在不打开 MySQL 3306 端口的情况下,使用 Navicat 进项远程连接(使用2...

计算机专业ic设计,ic设计是什么专业_IC设计的设计方法-程序员宅基地

文章浏览阅读2.2k次。ic设计是什么专业IC专业就是集成电路设计专业。集成电路设计,是电子工程学和计算机zhi工程学的一个学科,其主要内容是运用专业的逻辑和电路设计技术设计集成电路(IC)。IC设计涉及硬件软件两方面专业知识。集成电路设计涉及对电子器件(例如晶体管、电阻器、电容器等)、器件间互连线模型的创建。所有的器件和互连线都需安置在一块半导体衬底材料之上,这些组件通过半导体器件制造工艺(例如光刻等)安置在单一的硅衬..._ic设计有哪些方法?

Hadoop集群环境搭建——文件上传_hadoop 图片上传-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏18次。实验内容Hadoop由Apache基金会开发的分布式系统基础架构,是利用集群对大量数据进行分布式处理和存储的软件框架。用户可以轻松地在Hadoop集群上开发和运行处理海量数据的应用程序。Hadoop有高可靠,高扩展,高效性,高容错等优点。Hadoop 框架最核心的设计就是HDFS和MapReduce。HDFS为海量的数据提供了存储,MapReduce为海量的数据提供了计算。此外,Hadoop还包括了Hive,Hbase,ZooKeeper,Pig,Avro,Sqoop,Flume,Mahout等项目。(摘_hadoop 图片上传

史上最全Redis面试题及答案-程序员宅基地

文章浏览阅读1w次,点赞7次,收藏93次。在网上看到有关Redis的50道面试题目,但是没有给出答案,之前我也在寻找这份试题的答案,特地把答案分享出来。有需要的可以看看咯花了大量时间整理了这套Redis面试题首发50题,绝无仅有,从入门到精通从基础,高级知识点,再到集群,运维,方案…弄明白了这些题可以说可以成为面霸了面试官都得折服,Redis学得怎么样,都来检验下吧..._redis面试题

随便推点

IDA pro 安装keypatch插件_ida fail to load the dynamic library.-程序员宅基地

文章浏览阅读8.9k次,点赞3次,收藏7次。IDA pro 7.5 安装keypatch插件前言一、安装过程二、出现问题前言本篇记录IDA pro 7.5 安装keypatch插件。缺少相应库,无法加载keypatch插件:"fail to load the dynamic library"一、安装过程安装好python环境后,安装 keystone。 (网址:https://www.keystone-engine.org/download/)pip install keystone-engine # 安装pip inst_ida fail to load the dynamic library.

【Unity】绘制阿基米德螺旋线-程序员宅基地

文章浏览阅读2.6w次,点赞9次,收藏23次。阿基米德螺旋线公式: //极坐标方程为: r = a + bθ //平面笛卡尔坐标方程式为: x = (a + bθ)cos(θ), y = (a + bθ)sin(θ) //a: 当θ=0°时的极径(mm) //b: 阿基米德螺旋线系数(mm/°),表示每旋转1度时极径的增加/减小量 //θ: 极角,单位为度,表示阿基米德螺旋线转过的总度数(弧度)......_阿基米德螺旋线

C++贪心算法之均分纸牌_粮食均分c++-程序员宅基地

文章浏览阅读8.3k次,点赞5次,收藏14次。均分纸牌题目描述有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。_粮食均分c++

编辑器之战_vi 有两个模式 :“不停地哔哔叫”和“搞砸一切”。-程序员宅基地

文章浏览阅读631次。编辑器之战 是指计算机编程领域内,两类文本编辑器vi(以及衍生版本)和Emacs用户之间的对抗冲突。这已经成为黑客文化和自由软件社区文化的一部分。战火在两群用户之间多次点燃,他们互相蔑视,坚信自己的选择才是最完美的。相比其他的IT领域战争(如浏览器大战、操作系统之争、编程语言之争、代码缩进风格之战),编辑器的选择其实通常只是个人问题。vi与Emacs的不同vi与Emacs之间最_vi 有两个模式 :“不停地哔哔叫”和“搞砸一切”。

JAVA 实现《坦克大战联机版》游戏_new ().mainpanel-程序员宅基地

文章浏览阅读3w次,点赞47次,收藏64次。坦克大战联机版_new ().mainpanel

python symbols函数_Python的高级特征你知多少?来对比看看-程序员宅基地

文章浏览阅读81次。Python 多好用不用多说,大家看看自己用的语言就知道了。但是 Python 隐藏的高级功能你都 get 了吗?本文中,作者列举了 Python 中五种略高级的特征以及它们的使用方法,快来一探究竟吧!Python 是一种美丽的语言,它简单易用却非常强大。但你真的会用 Python 的所有功能吗?任何编程语言的高级特征通常都是通过大量的使用经验才发现的。比如你在编写一个复杂的项目,并在 stack..._python symbols函数与lambda函数

推荐文章

热门文章

相关标签