Unicode 编码概念

Unicode 编码可能是我们日常开发中接触最多的字符编码方式之一,其它常见的中文编码方式还包括 GB2132-80 / GB13000 / GBK / GB18030 。在大部分的开发中,最常见、最常用的还是 Unicode ,它在各种编程语言中的支持相对比较完善,现在的网站和BS架构的应用,基本上都使用 Unicode 。因此,除非是特定的国际化需要, Unicode 能满足大部分的开发需要。

但要注意,Unicode 这个名称本身只是一个笼统的称呼。更深入细节来说,它包括几个编码格式: utf-8 / utf-16 / utf-32

utf-16

utf-16 是最早提出的 Unicode 编码方式,它采用 16 位来表示一个字符,理论上支持 65536 个字符。 支持 Unicode 的编程语言,像 java / C# 等,采用的是 utf-16 的编码格式。

采用定长的方式来表示字符,会带来计算速度方面的优势,在进行比较操作、字符定位操作时可以很容易通过计算直接定位。

但是 16 位的长度对于存储 ASCII 的字符来说就浪费了,因为它们本身只需要 7 位就能完全表示出来。如果用在存储数据方面,那么采用 utf-16 就会造成很多空间浪费。

utf-8

utf-8 并不是使用 8 位来表示一个字符。 utf-8 是一种变长的编码方式,也就是说,它可以根据需要,用 8 位、 16 位或 24 位来表示一个字符。在 ASCII 范围的字符,在 utf-8 中编码是相同的,都采用 8 个位 ( 只使用 7 个有效位 )。而汉字字符,由于数量多,那么需要采用 16 或 24 位。

与 utf-16 相比, 在混合存储数据时,一般 utf-8 可以节省存储空间,同时满足多语言的需求。因此,常见的文件编码格式、数据库存储字符编码,采用 utf-8 。以数据库为例,uuid/email/phone 等常见的数据字段基本上都是英文、数字、简单符号,同时会混合住址、备注资料等中文内容,因此一般会采用 utf-8 (同时,utf-8 没有字节序问题,不容易产生混淆)

而 utf-8 进入到程序处理时,就需要转换为编程语言内置的 utf-16 。这个转换是经过算法优化的,不需要担心性能问题。转换之后,才能在编程语言中进行相应的字符处理。

utf-32

utf-32 也属于定长的编码方式,使用 32 位表示一个字符。它可以表示更大范围的字符。但就目前的应用而来看,一般采用 utf-16 就足够,支持 utf-32 的系统和程序并不普遍。

字节序问题

在具体的实现上,定长字节的编码方式会存在一个字节序的问题,这个问题类似于网络字节序问题。字节序问题源于在发送和接收的过程中,一个整个的结构如何切分为字节,如何把字节重新还原为原有的结构。

utf-8 是基于字节的,它是基本的传输单位,因此 utf-8 不存在字节序问题,发送者和接收者都是按顺序一个字节一个字节处理的。但对于 utf-16 和 utf-32 , 在传送时应该先传送那个字节,就会成为一个问题。如果双方没有约定,接收者无法确定发送者是先传高字节或是低字节,因此接收者就没有办法组织字节顺序构建正确的字符。而为了让这个问题显得更复杂,专家们脑洞大开,不同的系统平台上采用了不同的字节序的处理方法 :-)

因此,针对字节序问题,在 Unicode 中形成约定,在开始处加上字节序标记 Byte Order Mark , BOM:

对 utf-16:
使用 FF FE 开头,为小数端 utf-16-le ( 小数在后 )
使用 FE FF 开头,为大数端 utf-16-be ( 大数在后 )

对 utf-32:
使用 FF FE 00 00 开头,为小数端 utf-32-le ( 小数在后 )
使用 00 00 FE FF 开头,为大数端 utf-32-be ( 大数在后 )

另外, utf-8 默认加上 EF BB BF

在打开文件上要小心,当使用 utf-8 方式打开文件时,如果文件缺少 BOM , 某些程序会“很聪明”地在文件开头加上 BOM 。这个“聪明”的设计曾经给我带来过问题,在数据库导出之后,再导入时发现了开始的数据出现乱码,通过 16 进制编辑器一看,发现数据文件头部被加了 BOM ~~

Unicode 编码概念的更多相关文章

  1. 从Java String实例来理解ANSI、Unicode、BMP、UTF等编码概念

    转(http://www.codeceo.com/article/java-string-ansi-unicode-bmp-utf.html#0-tsina-1-10971-397232819ff9a ...

  2. 【C# 基础概念】Unicode编码详解

    Unicode定义:Unicode(统一码.万国码.单一码)是计算机科学领域里的一项业界标准,包括字符集.编码方案等.Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字 ...

  3. unicode 与 utf-8 编码概念及区别

    unicode 是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案.每个字符都对应一个编号,编号的范围是0-0x10FFFF来.Unicode 是为了解决传统的字符编码方案的局限而产生的,它为 ...

  4. [转]程序员趣味读物:谈谈Unicode编码

    from : http://pcedu.pconline.com.cn/empolder/gj/other/0505/616631_all.html#content_page_1 这是一篇程序员写给程 ...

  5. 转载:谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词

    转载: 谈谈Unicode编码,简要解释UCS.UTF.BMP.BOM等名词 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级 ...

  6. [百度空间] [转]程序员趣味读物:谈谈Unicode编码

    出处:CSDN [ 2005-05-13 10:05:53 ] 作者:fmddlmyy 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG ...

  7. Java Unicode编码 及 Mysql utf8 utf8mb3 utf8mb4 的区别与utf8mb4的过滤

    UTF-8简介 UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码.它可以用来表示Unicode标准中的任何 ...

  8. 刨根究底字符编码之八——Unicode编码方案概述

    Unicode编码方案概述   1. 前面讲过,随着计算机发展到世界各地,于是各个国家和地区各自为政,搞出了很多既兼容ASCII但又互相不兼容的各种编码方案.这样一来同一个二进制编码就有可能被解释成不 ...

  9. 浅谈Unicode编码

    目录 1.概述 2.ASCII编码 3.历史问题 4.Unicode 4-1.Unicode 编码方案 4-2.关于bom 5.UTF-8 6.UTF-16 1.概述 对于ASCII编码,相信同学们都 ...

随机推荐

  1. hdu Waiting ten thousand years for Love

    被这道题坑到了,如果单纯的模拟题目所给的步骤,就会出现同一个位置要走两次的情况...所以对于bfs来说会很头痛. 第一个代码是wa掉的代码,经过调试才知道这个wa的有点惨,因为前面的操作有可能会阻止后 ...

  2. Java集合之Collection接口

    java的集合分为三大接口,分别是Collection,Map,Iterator,集合接口和类在java.util包中,此次主要介绍三大接口之一的Collection接口. 一些Collection允 ...

  3. HRBUST 1326 循环找父节点神术

    题意 给出一个图 给出a点到每个点的路径 最后经过的除这个点本身以外的点 现在把a点改为b点 让求出按上面那种方式 把除b之外的点对应的点列出 ...算了我描述题意得能力好差...这个锅还是给出题的吧 ...

  4. [办公自动化]PDF大小不一如何调整

    最近使用acrobat制作PDF,结果里面的内容因为来自不同文件.有的大,有的小. 选择打印pdf,即可调整正常. 附: PDF页码也可以调整为与目录实际页码一致. 思考: 利用pdf进行问卷调研:或 ...

  5. Nginx 笔记与总结(13)Nginx 的 gzip 压缩

    使用 FireFox(40.0)访问博客园(http://www.cnblogs.com/),观察 http 头信息 请求头信息: Accept-Encoding gzip, deflate 表示浏览 ...

  6. ECSHOP二次开发指南

    ECSHOP二次开发指南 发布时间:2013-05-28 12:47:00   来源:   评论:0 点击: 次 [字号:大 中 小] QQ空间新浪微博腾讯微博人人网豆瓣网百度空间百度搜藏开心网复制更 ...

  7. WEB系统开发

    最近根据项目组需求做了web工作流程系统,就是一个简单的web管理系统,取代原先使用的excel表格,在VS2008下面开发,数据库使用Mysql,使用Mysql-connecte 5.0与数据库连接 ...

  8. 用宏 x y z,找出最大值最小值

    #define max(x,y,z) ((x)>(y)?(x):(y))>(z)?((x)>(y)?(x):(y)):(z) #define min(x,y,z) ((x)<( ...

  9. mysql 权限篇

    mysql库 user(用户以及所有库权限配置) db(具体库权限配置) 配置完毕要用命令 FLUSH PRIVILEGES; 刷新权限 备份数据库可以直接copy文件的形式,不过这样copy的文件会 ...

  10. 单选按钮控件(Ridio Button)的使用

    VC学习笔记5:单选按钮控件(Ridio Button)的使用 一.对单选按钮进行分组: 每组的第一个单选按钮设置属性:Group,Tabstop,Auto;其余按钮设置属性Tabstop,Auto. ...