以下仅为个人学习的记录,如有疏漏不妥之处,还请不吝赐教

关系 

  Unicode是一个字符集。顾名思义,字符的集合。GBK,BIG5,ISO8859-1,ASCII都是字符集。

  有一点不同的是,Unicode并没有规定字符的编码是如何实现的,上述的其它字符集有其编码方式。Unicode就好比java中的抽象类,实现编码的方法是抽象的。因此,需要实现编码方式才能应用于实际。UTF-8,UTF-16实现它编码方式。

UTF-8

  UTF-8是变长的。即字符编码的字节数有差异。比如"A"的编码0x41, 只需一个字节,"中"的编码是0xe4b8ad,则需要三个字节,大部分中文字符的编码都是三个字节。

UTF-8的编码方式

  

UTF-8编码(参考wiki百科)
字节数

起始

码点

终止

码点

字节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的编码方式

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的关系的更多相关文章

  1. Unicode 与 Unicode Transformation Format(UTF,UTF-8 / UTF-16 / UTF-32)

    ASCII(American Standard Code for Information Interchange):早期它使用7 bits来表示一个字符,总共表示27 = 128个字符:后来扩展到8 ...

  2. Unicode 字符和UTF编码的理解

    Unicode 编码的由来 我们都知道,计算机的内部全部是由二进制数字0, 1 组成的, 那么计算机就没有办法保存我们的文字, 这怎么行呢? 于是美国人就想了一个办法(计算机是由美国人发明的),也把文 ...

  3. Ansi、GB2312、GBK、Unicode(utf8、16、32)

    关于ansi,一般默认为本地编码方式,中文应该是gb编码 他们之间的关系在这边文章里描写的很清楚:http://blog.csdn.net/ldanduo/article/details/820353 ...

  4. Unicode 与 utf8 utf16 utf32的关系

    Unicode是计算机领域的一项行业标准,它对世界上绝大部分的文字的进行整理和统一编码,Unicode的编码空间可以划分为17个平面(plane),每个平面包含2的16次方(65536)个码位.17个 ...

  5. 简述 ascii、unicode、utf-8、gbk 的关系 (全网最全!!!)

    ascii 是最早美国用的标准信息交换码,把所有的字母的大小写,各种符号用 二进制来表示,共有256中,加入些拉丁文等字符,1bytes代表一个字符, Unicode是为了统一世界各国语言的不用,统一 ...

  6. 浅谈unicode编码和utf-8编码的关系

    字符串编码在Python里边是经常会遇到的问题,特别是写文件以及网络传输的过程中,当调用某些函数的时候经常会遇到一些字符串编码提示错误,所以有必要弄清楚这些编码到底在搞什么鬼. 我们都知道计算机只能处 ...

  7. 字符编码ascii、unicode、utf-­‐8、gbk 的关系

    ASIIC码: 计算机是美国人发明和最早使用的,他们为了解决计算机处理字符串的问题,就将数字字母和一些常用的符号做成了一套编码,这个编码就是ASIIC码.ASIIC码包括数字大小写字母和常用符号,一共 ...

  8. 字符集、字符编码、国际化、本地化简要总结(UNICODE/UTF/ASCII/GB2312/GBK/GB18030)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明   普通的linux 和 普通的windows.    ...

  9. Delphi7中Unicode,ANSI,UTF编码问题

    注解: ANSI     'American Standard Code for Information Interchange' 美国信息互换标准代码 ANSI的'Ascii'编码 Unicode ...

  10. Unicode和UTF-8的关系

    Unicode和UTF-8都是表示编码,这个我一直都知道,但是这两个实际上是干什么用的,到底是怎么编码的,为什么有了Unicode还要UTF-8,它们之间有什么联系又有什么区别呢?这个问题一直困扰着我 ...

随机推荐

  1. 进程间通信之——队列Queue

    队列是先进先出. from multiprocessing import Queue q = Queue(6) # 队列容纳上限 q.put(1) # 放到队列里面 q.put(2) q.put(3) ...

  2. hibernate配置二级缓存

    ehcache.xml: < ?xml version=”1.0″ encoding=”UTF-8″?>< !– defaultCache节点为缺省的缓存策略 maxElements ...

  3. windows Apache服务器简单配置虚拟域名(转载)

    1.找到apache目录下的conf下的extra下的httpd-vhosts.conf虚拟主机配置文件 将下面的代码复制粘贴到最下面:   #<VirtualHost *:80>#   ...

  4. thinkphp5中使用phpmailer实现发送邮件功能(转载)

    一.开启SMTP服务(使用php发送邮件需要用到SMTP服务,这里以163邮箱的SMTP服务为例). 1.登录163邮箱,在首页上找到“设置”. 2.选择开启的服务,一般都全选,POP3/SMTP/I ...

  5. 13 form表单

    form表单中可包括 <input > 类型包括 text(name,value) password(name,value) checkbox(name,value) radio(chec ...

  6. Navicat导入sql server数据库

    1.新建连接 2. EXEC sp_attach_db @dbname = 'demo',   (数据库的名字) @filename1 = 'G:\C#\超市管理系统\DB\CSGL.mdf', @f ...

  7. 通过ALT+F9关键CALL追踪注册码

    1)弹出关键字对话框,记录关键字注册失败,请检查···· 2)使用PEID查壳 3)peid提示无壳 4)发送到OD 5)F9使od运行 5.1)继续输入用户 5.2)使其暂停 5.3)点击调试中的执 ...

  8. 切分 拆分集合list的方式

    一般有两种,第一是sublist(),代码冗余效率低: 第二种: 引包自 com.google.common.collect.Lists 话不多说直接上实例: List<ContractMode ...

  9. Codeforces 1136E - Nastya Hasn't Written a Legend - [线段树+二分]

    题目链接:https://codeforces.com/problemset/problem/1136/E 题意: 给出一个 $a[1 \sim n]$,以及一个 $k[1 \sim (n-1)]$, ...

  10. MAC OSX Xcode硬盘清理

    1.移除对旧设备的支持影响:可重新生成:再连接旧设备调试时,会重新自动生成.我移除了4.3.2, 5.0, 5.1等版本的设备支持.路径:~/Library/Developer/Xcode/iOS D ...