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编码,相信同学们都 ...
随机推荐
- 三星S4接电话黑屏无法挂断通话
最近发现S4的通话距离感应起出了问题,接电话后直接熄屏,按什么按钮都没有反应.通话结束后只能等对方挂断才会恢复正常,再或者长按9秒电源键强制重启.极大的影响了实用体验.网上搜了下,发现这样的问题还不少 ...
- C# - MVC
Controllers 位置:Controllers 命名:HomeController // Views/Home/Index public ActionResult Index() { Vie ...
- 获取Dell,Lenovo电脑的保修期
2015-4-6写的代码(Dell), 不知道如何对报错进行友好化处理,于是采用了"非空"和"非空的补集"处理方式. $service = New-WebSer ...
- 如何处理NBU Frozen Media
https://support.symantec.com/en_US/article.TECH21473.html
- debug阶段工作期站立会议1
组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git.coding.n ...
- Js组件的一些写法【转】
首先看下Prototype里的写法: var Class = { create: function() { return function() { this.init.apply(this, argu ...
- Json工具类,实现了反射将整个Object转换为Json对象的功能,支持Hibernate的延迟加
package com.aherp.framework.util; import java.lang.reflect.Array;import java.lang.reflect.Method;imp ...
- Web 在线文件管理器学习笔记与总结(10)查看文件夹中的内容
① 读取文件夹大小 a. 封装计算文件夹大小的函数 b. 打开文件夹 c. 循环判断文件夹下的内容是文件还是文件夹,如果是文件,则累积相加文件的大小:如果是文件夹,则递归调用该函数 注意两个问题: ...
- 以http形式启动uwsgi服务
uwsgi yourfile.ini # 配置文件 [uwsgi] http = 127.0.0.1:3106 socket = 127.0.0.1:3006 chdir = /www/student ...
- 常用Ubuntu 命令
sudo apt-get updatesudo apt-get upgrade以下2選1sudo apt-get install ubuntu-desktop如果你只想安装必要的桌面管理软件而不想安装 ...