Unicode UTF-8 UTF-16的关系
以下仅为个人学习的记录,如有疏漏不妥之处,还请不吝赐教。
关系
Unicode是一个字符集。顾名思义,字符的集合。GBK,BIG5,ISO8859-1,ASCII都是字符集。
有一点不同的是,Unicode并没有规定字符的编码是如何实现的,上述的其它字符集有其编码方式。Unicode就好比java中的抽象类,实现编码的方法是抽象的。因此,需要实现编码方式才能应用于实际。UTF-8,UTF-16实现它编码方式。
UTF-8
UTF-8是变长的。即字符编码的字节数有差异。比如"A"的编码0x41, 只需一个字节,"中"的编码是0xe4b8ad,则需要三个字节,大部分中文字符的编码都是三个字节。
UTF-8的编码方式
| 字节数 |
起始 码点 |
终止 码点 |
字节1 |
字节2 | 字节3 | 字节4 |
| 1 | U+0000 | U+007F | xxxxxxx | |||
| 2 | U+0080 | U+07FF | xxxxx | xxxxxx | ||
| 3 | U+0800 | U+FFFF | xxxx | xxxxxx | xxxxxx | |
| 4 | U+10000 | U+1FFFFF | xxx | xxxxxx | xxxxxx | xxxxxx |
以字符"中" 为例:
1. 查找"中"字的Unicode 码点(code point), U+4e2d, 二进制码点表示为 0100 1110 0010 1101
2. 因为U+0800 < U+4e2d < U+FFFF, 可知需要三个字节编码。
3. 从右到左将二进制码点填写到xxx中。得到11100100 10111000 10101101 即0xe4b8ad.
UTF-16
UTF-16开始时是定长的,后来也变长的,UTF-16使用两个或四个字节编码。java一开始选择UTF-16作为运行时的字符编码,是因为字符定长编码带来的字符操作便利。UTF-16中有一个术语代码(code unit)。编码时每16个位就是一个代码单元。用4个字节编码时,就是编码为两个代码单元。
UTF-16的编码方式
| 字节数 | 字节1 | 字节2 | 字节3 | 字节4 |
| 2 | xxxx xxxx | xxxx xxxx | ||
| 4 | 1101 10xx | xxxx xxxx | 1101 11xx | xxxx xxxx |
还是以字符"中"为例:
1.查找"中"字的Unicode 码点(code point), U+4e2d, 二进制码点表示为 0100 1110 0010 1101
2.直接按照码点进行编码,得到0x4e2d.也就是说其实UTF-16的两个字节编码和Unicode的码点是完全一样的。
总结
UTF-8和UTF-16两种编码方式是不兼容的。
延伸阅读:
深入分析 Java 中的中文编码问题: https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/#icomments
字符编码笔记:ASCII,Unicode 和 UTF-8:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
Wiki百科:https://en.wikipedia.org/wiki/UTF-16
https://en.wikipedia.org/wiki/UTF-8
https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/
Unicode UTF-8 UTF-16的关系的更多相关文章
- Unicode 与 Unicode Transformation Format(UTF,UTF-8 / UTF-16 / UTF-32)
ASCII(American Standard Code for Information Interchange):早期它使用7 bits来表示一个字符,总共表示27 = 128个字符:后来扩展到8 ...
- Unicode 字符和UTF编码的理解
Unicode 编码的由来 我们都知道,计算机的内部全部是由二进制数字0, 1 组成的, 那么计算机就没有办法保存我们的文字, 这怎么行呢? 于是美国人就想了一个办法(计算机是由美国人发明的),也把文 ...
- Ansi、GB2312、GBK、Unicode(utf8、16、32)
关于ansi,一般默认为本地编码方式,中文应该是gb编码 他们之间的关系在这边文章里描写的很清楚:http://blog.csdn.net/ldanduo/article/details/820353 ...
- Unicode 与 utf8 utf16 utf32的关系
Unicode是计算机领域的一项行业标准,它对世界上绝大部分的文字的进行整理和统一编码,Unicode的编码空间可以划分为17个平面(plane),每个平面包含2的16次方(65536)个码位.17个 ...
- 简述 ascii、unicode、utf-8、gbk 的关系 (全网最全!!!)
ascii 是最早美国用的标准信息交换码,把所有的字母的大小写,各种符号用 二进制来表示,共有256中,加入些拉丁文等字符,1bytes代表一个字符, Unicode是为了统一世界各国语言的不用,统一 ...
- 浅谈unicode编码和utf-8编码的关系
字符串编码在Python里边是经常会遇到的问题,特别是写文件以及网络传输的过程中,当调用某些函数的时候经常会遇到一些字符串编码提示错误,所以有必要弄清楚这些编码到底在搞什么鬼. 我们都知道计算机只能处 ...
- 字符编码ascii、unicode、utf-‐8、gbk 的关系
ASIIC码: 计算机是美国人发明和最早使用的,他们为了解决计算机处理字符串的问题,就将数字字母和一些常用的符号做成了一套编码,这个编码就是ASIIC码.ASIIC码包括数字大小写字母和常用符号,一共 ...
- 字符集、字符编码、国际化、本地化简要总结(UNICODE/UTF/ASCII/GB2312/GBK/GB18030)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明 普通的linux 和 普通的windows. ...
- Delphi7中Unicode,ANSI,UTF编码问题
注解: ANSI 'American Standard Code for Information Interchange' 美国信息互换标准代码 ANSI的'Ascii'编码 Unicode ...
- Unicode和UTF-8的关系
Unicode和UTF-8都是表示编码,这个我一直都知道,但是这两个实际上是干什么用的,到底是怎么编码的,为什么有了Unicode还要UTF-8,它们之间有什么联系又有什么区别呢?这个问题一直困扰着我 ...
随机推荐
- UCloud 机房的网络搭建(计蒜客初赛第五场)
UCloud 刚刚建立一个新机房,近日正在进行网络搭建.机房内有 nn 台服务器和 mm 个分线器,整个机房只有一个网线出口.分线器的作用是将一根网线转换成多根网线.蒜头君也知道每个分线器输出的最大网 ...
- VS2015编译rtklib2.4.2
准备工作 在VS2015下新建一个win32的dll项目(空项目) 把在github上下载的rtklib2.4.2里的src文件夹复制到刚刚建立的win32下 把src里的文件添加到项目里,其中头文件 ...
- 使用stylus
1. 首先确保 node + npm 环境一切正常. 2. 全局安装 stylus: 在命令行中: npm i stylus@latest -g 3. 此时可以创建 .s ...
- laravel5.4将excel表格中的信息导入到数据库中
本功能是借助 Maatwebsite\Excel 这个扩展包完成的,此扩展包的安装过程请参考上篇博文:http://www.cnblogs.com/zhuchenglin/p/7122946.html ...
- 飞机躲避炮弹---java
最近闲来无事,花了一天多的时间写了一个小游戏,虽然说游戏本身很无聊吧,但是自己也从这个过程中学到了许多东西...分享一下. 代码内容自行理解吧... 层次结构: package cn.sxt.game ...
- python学习之旅(十五)
Python基础知识(14):函数(Ⅴ) 一.装饰器 decorator:本质上就是函数,可以增强函数的功能. 定义起来虽然有点复杂,但使用起来非常灵活和方便 1.不修改被装饰函数的源代码 2.不修改 ...
- C语言编程(多线程)
C语言中多线程编程包括的文件:#include<pthread.h>(linux环境下) pthread_t //线程函数返回类型 pthread_mutrex_t //互斥锁类型 int ...
- CentOS最小化系统,怎么安装图形界面
CentOS最小化系统做服务器,都是没有图形界面的.很多初学者不习惯命令行操作,那么应该怎么安装图形界面?本经验咗嚛以centos6.5系统为例 方法步骤: 首先进入centos系统界面,先测 ...
- C和C指针小记(十八)-使用结构和指针-双向链表
1.双链表 1.1 双向链表的声明 在一个双链表中,每个节点都包含两个指针--指向前一个节点的指针和指向后一个节点的指针. 声明 typedef struct NODE { struct NODE * ...
- Rob Pike
罗布·派克_百度百科 https://baike.baidu.com/item/罗布·派克 1. 你无法断定程序会在什么地方耗费运行时间.瓶颈经常出现在想不到的地方,所以别急于胡乱找个地方改代码, ...