Unicode 编码概念
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 编码概念的更多相关文章
- 从Java String实例来理解ANSI、Unicode、BMP、UTF等编码概念
转(http://www.codeceo.com/article/java-string-ansi-unicode-bmp-utf.html#0-tsina-1-10971-397232819ff9a ...
- 【C# 基础概念】Unicode编码详解
Unicode定义:Unicode(统一码.万国码.单一码)是计算机科学领域里的一项业界标准,包括字符集.编码方案等.Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字 ...
- unicode 与 utf-8 编码概念及区别
unicode 是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案.每个字符都对应一个编号,编号的范围是0-0x10FFFF来.Unicode 是为了解决传统的字符编码方案的局限而产生的,它为 ...
- [转]程序员趣味读物:谈谈Unicode编码
from : http://pcedu.pconline.com.cn/empolder/gj/other/0505/616631_all.html#content_page_1 这是一篇程序员写给程 ...
- 转载:谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
转载: 谈谈Unicode编码,简要解释UCS.UTF.BMP.BOM等名词 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级 ...
- [百度空间] [转]程序员趣味读物:谈谈Unicode编码
出处:CSDN [ 2005-05-13 10:05:53 ] 作者:fmddlmyy 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG ...
- Java Unicode编码 及 Mysql utf8 utf8mb3 utf8mb4 的区别与utf8mb4的过滤
UTF-8简介 UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码.它可以用来表示Unicode标准中的任何 ...
- 刨根究底字符编码之八——Unicode编码方案概述
Unicode编码方案概述 1. 前面讲过,随着计算机发展到世界各地,于是各个国家和地区各自为政,搞出了很多既兼容ASCII但又互相不兼容的各种编码方案.这样一来同一个二进制编码就有可能被解释成不 ...
- 浅谈Unicode编码
目录 1.概述 2.ASCII编码 3.历史问题 4.Unicode 4-1.Unicode 编码方案 4-2.关于bom 5.UTF-8 6.UTF-16 1.概述 对于ASCII编码,相信同学们都 ...
随机推荐
- cookiecutter-flask生成的框架里边自带了一个CRUDMixin类
单元测试的必要性 之前曾经写过一篇讲单元测试的,正好最近也在实践和摸索.我似乎有种洁癖,就是我会严格遵守流程性的东西,比如测试,注释和文档等.目前就职的公司在我接手项目的时候是没有一行单元测试的,我挺 ...
- 中科大各Linux发行版的更新源列表
sudo vi /etc/apt/sources.list Raspberry Pi deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ jessie ...
- ZZULIOJ 1726 迷宫(BFS+小坑)
1726: 迷宫 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 394 Solved: 64 SubmitStatusWeb Board Descr ...
- java int转integer方法
由于AutoBoxing的存在,以下代码在JDK1.5的环境下可以编译通过并运行. int i = 0; Integer wrapperi = i; 还有其他方法? JDK1.5为Integer增加了 ...
- Windows与Linux/Mac系统时间不一致的解决方法
Windows与Linux/Mac系统时间不一致的解决方法 分类: linux2012-02-12 14:25 1691人阅读 评论(1) 收藏 举报 windowsubuntusystemlinux ...
- 如何开发ecshop支付插件
如何开发ecshop支付插件 ecshop模板网 / 2014-06-03 目标一:搞懂ecshop的支付流程 选完商品,进入购物车页面,点击“结算中心”,页面跳转到flow.php?step=che ...
- Apache服务器安装配置
Apache服务器安装 1.Apache服务器安装 在Linux系统下,apache服务器的安装方式比较灵活,可以使用二进制包安装,比如:rpm包.deb包.已编译好的包.也可以简单的使用y ...
- 【php学习】数组操作
1.json字符串和数组之间的转换 json_decode($jsonStr) json字符串解码为php变量,若第二个参数默认为false,返回一个对象:若第二个参数设置true,则返回一 ...
- 利用js轻松实现页面简繁体转换
使用方法:StranBody(); //转换对象,使用递归,逐层剥到文本 function StranBody(fobj) { if(typeof(fobj)=="object") ...
- php常用代码
$total_count = mysql_num_rows($rslt);//返回记录条数 date("ymdHis");//130618104741 注:年份没有前两位 PHP手 ...