很多人,即使是有一些项目经验的人,都说过这句话。但是如果深入的理解什么是unicode之后就会知道,原来我们经常说的这句话“unicode字符是2个字节”这句话是有问题的。

要说清楚这个问题,首先就要说清楚unicode到底是什么。

unicode是一个标准,也可以说是世界上的语言字符和数字映射的一种标准。它没有限制字符的数量,但是可能这个标准规定的映射只是映射了一部分字符。每个字符映射一个code point(码点)。Unicode 目前规划的总空间是17个平面(平面0至16),0x0000 至 0x10FFFF。每个平面有 65536 个码点。

所以Unicode支持的字符上限是65536个 这句话也是有问题的,这65536个字符是我们最常用的基本字符,但是还有很多字符是在0x0000--0xFFFF之外的。在我们说unicode是几个字节这句话的时候,就已经暗示了我们现在讨论的是unicode在计算机内存里的存储方式了(只有在计算机系统里才有字节这种定义,如果脱离计算机的话unicode是不会与字节扯上关系的)。unicode存储在计算机内存里肯定是需要编码的,那么就有UTF-8,UTF-16,UTF-32等编码方案。为什么我们常说“unicode字符是2个字节”,是因为windows默认的unicode编码就是UTF-16。而unicode在这种编码下,大部分都是2个字节的,至少上面提到的前65536个基本常用字符都是2个字节的。所以就有了“unicode字符是2个字节”这句话。其实UTF-16是一种变长的编码方案,有些unicode字符的抽象码点(code point)编码后是2个字节,有些是4个字节。所以“unicode字符是2个字节”这句话大多数时候是正确的,但是unicode字符的抽象码点(code point)超过范围0x0000--0xFFFF后就不对了。

如果是为了跨平台兼容性,只需要知道,在 Windows 记事本的语境中:

  • 所谓的「ANSI」指的是对应当前系统 locale 的遗留(legacy)编码。
  • 所谓的「Unicode」指的是带有 BOM 的小端序 UTF-16。
  • 所谓的「UTF-8」指的是带 BOM 的 UTF-8。
下面是关于上面windows语境的一些词语的解释:

1.BOM(byte order mark)是为 UTF-16 和 UTF-32 准备的,用于标记字节序(byte order)。微软在 UTF-8 中使用 BOM 是因为这样可以把 UTF-8 和 ASCII 等编码明确区分开,但这样的文件在 Windows 之外的操作系统里会带来问题。 2.「UTF-8」和「带 BOM 的 UTF-8」的区别就是有没有 BOM。即文件开头有没有 U+FEFF。
 
所以在谈及unicode的编码方案时是离不开计算机的微处理器的(决定字节顺序,是大端还是小端),以及操作系统(比如windows默认的上述语境:unicode指UTF-16).
注意:编码的目的在于在计算机系统里利于存储(减少空间占用),在网络传输里利于传输(减少数据量,不用考虑字节顺序的问题等)。其实就是把抽象的东西,编码成10等二进制字节流,并且尽量的减少内存空间的占用和网络传输时带宽的占用。

unicode和utf8的更多相关文章

  1. Unicode 和 UTF-8 有何区别?

    Unicode符号范围 (一个字符两个字节)     | UTF-8编码方式 (十六进制)     | (二进制) —————————————————————– 这儿有四个字节从-----00 00 ...

  2. Unicode和UTF-8的关系

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

  3. 字符编码笔记:ASCII,Unicode和UTF-8

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节". 再后来,他们又做了一些可以处理 ...

  4. 字符编码笔记:ASCII,Unicode和UTF-8 转

    本文出处 http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html 只是为了记录一下省得要去搜. 今天中午,我突然想搞清楚 ...

  5. [转]字符编码笔记:ASCII,Unicode和UTF-8

    转自:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html 作者: 阮一峰 日期: 2007年10月28日 今天中午, ...

  6. 字符编码笔记:ASCII,Unicode和UTF-8(转载)

    作者: 阮一峰 日期: 2007年10月28日 今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步 ...

  7. 简单几句话总结Unicode,UTF-8和UTF-16

    概念 先说一说基本的概念,这包括什么是Unicode,什么是UTF-8,什么是UTF-16. Unicode,UTF-8,UTF-16完整的说明请参考Wiki(Unicode,UTF-8,UTF-16 ...

  8. Unicode 和 UTF-8 的关系

    曾经这个世界上,有着gb2312,gbk,latin1,utf 等各种字符集,现在,我们也能不时的看到他们的身影. 但是值得庆幸的事,时过境迁,这些主要的字符集,都已经逐渐被utf8取代. 但是我们很 ...

  9. unicode,ansi,utf-8,unicode big endian编码的区别

    知乎--http://www.zhihu.com/question/23374078 http://wenku.baidu.com/view/cb9fe505cc17552707220865.html ...

  10. 关于几种编码详解(Unicode,UTF-8,GB系列)

    最近学Python,老是被编码的问题搞得晕乎乎的,晚上看了好多篇博客,整理出来一个比较清晰的关于几种编码以及字符集的思路. 主要参考:http://blog.sina.com.cn/s/blog_6d ...

随机推荐

  1. 【转】Monkey测试2——Monkey测试策略

    Monkey的测试策略 一. 分类 Monkey测试针对不同的对象和不同的目的采用不同的测试方案,首先测试的对象.目的及类型如下: 测试的类型分为:应用程序的稳定性测试和压力测试 测试对象分为:单一a ...

  2. Split Divisibilities (Project Euler 598)

    题目大意: 求将$100!$ 拆成$a*b$的方案数,其中$a<=b$并且它们的约数个数一样多. 思路: 先将$100!$质因数分解, 结果如图: 首先想到一个暴力DP, dp[i][j][k] ...

  3. posix正则表达式说明

    转载自:http://baiy.cn/utils/_regex_doc/index.htm 正则表达式说明 简介 大体来讲,正则表达式的文法分为3种标准:BRE.ERE 和 ARE.其中 BER 和 ...

  4. Muduo网络库源代码分析(六)TcpConnection 的生存期管理

    TcpConnection是使用shared_ptr来管理的类,由于它的生命周期模糊.TcpConnection表示已经建立或正在建立的连接.建立连接后,用户仅仅须要在上层类如TcpServer中设置 ...

  5. asp.net源程序编译为dll文件并调用的实现过程

    很多时候,我们需要将.cs文件单独编译成.dll文件,这就需要使用csc命令将.cs文件编译成.dll动态链接库文件.具体的操作步骤如下: 打开命令窗口->输入cmd到控制台->cd C: ...

  6. Unity3D学习笔记——IDE工作视图

    Unity3D中五个界面的使用: Project视图:存放游戏资源,比如贴图,音频,JS脚本等 Project中可创建的文件如下: Hierarchy视图:主要存放游戏场景中的对象,如摄像机,精灵,箱 ...

  7. OpenGL ES andoid学习————1

    package com.xhm.getaccount; import javax.microedition.khronos.egl.EGLConfig; import javax.microediti ...

  8. eclipse 解决编译出现GBK或UTF8 编码错误的方法

    eclipse由于开源所以支持了比较杂的编码方式,而这些一个工程导入时添加了不少的外来程序,由于不是同一工程一次编码带来了其中含有GBK和 UTF8   UTF16  ASCII等文件编译时就会出现错 ...

  9. Linux基础分析

    1.系统目录 [root@15b883 ~]# tree -L 1 / ├── bin 常用二进制命令所在的目录 ├── boot 内核及系统引导程序所在的文件目录 ├── dev 设备目录 ├── ...

  10. LeetCode Problem 136:Single Number

    描述:Given an array of integers, every element appears twice except for one. Find that single one. Not ...