`
tommyzhangming
  • 浏览: 4643 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论
阅读更多
UTF8是一种储存和传送的格式。

UTF8是以8bits即1Bytes为编码的最基本单位,也可以基于16bits和32bits的形式,分别称为UTF16和UTF32,但目前使用不多,而UTF8则被广泛应用在文件储存和网络传输中。

编码原理

先看这个模板:

UCS-4 range (hex.) UTF-8 octet sequence (binary)

0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx

0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx

编码步骤:
1) 首先确定需要多少个8bits(octets)

2) 按照上述模板填充每个octets的高位bits
3) 把字符的bits填充至x中,字符顺序:低位→高位,UTF8顺序:最后一个octet的最末位x→第一个octet最高位x
4) 解码的原理一样。

实例:(留意每个bit的颜色,粗体字为模板内容)

UCS-4 UTF-8
HEX BIN Bytes BIN HEX Bytes
0000 000A 00001010 4 00001010 0A 1
0000 0099 10011001 4 11000010 10011001 C2 99 2

0000 8D99 10001101 10011001 4 11101000 10110110 10011001 E8 B6 99 3

以UTF8格式储存的文件档首标识为EF BB BF。

效率

从上述编码原理中得可以得以下结论:
1.每个英文字母、数字所占用空间为1 Byte。
2.汉字占3 Bytes。
而直接使用无论是ANSI还是Unicode/UCS2来编码,中文都只占用2字节。所以UTF8对英文来说是个非常好的方案,但对中文来说并不是一个好的选择。

也就是说,英文编码一般用UTF8,中文使用的是GB18030

Unicode:
unicode.org制定的编码机制, 要将全世界常用文字都函括进去.
在1.0中是16位编码, 由U+0000到U+FFFF. 每个2byte码对应一个字符; 在2.0开始抛弃了16位限制, 原来的16位作为基本位平面, 另外增加了16个位平面, 相当于20位编码, 编码范围0到0x10FFFF.

UCS:

ISO制定的ISO10646标准所定义的 Universal Character Set, 采用4byte编码.

Unicode与UCS的关系:
ISO与unicode.org是两个不同的组织, 因此最初制定了不同的标准; 但自从unicode2.0开始,
unicode采用了与ISO 10646-1相同的字库和字码, ISO也承诺ISO10646将不会给超出0x10FFFF的UCS-4编码赋值,
使得两者保持一致.

UCS的编码方式:
UCS-2, 与unicode的2byte编码基本一样.
UCS-4, 4byte编码, 目前是在UCS-2前加上2个全零的byte.

UTF: Unicode/UCS Transformation Format

UTF-8, 8bit编码, ASCII不作变换, 其他字符做变长编码, 每个字符1-3 byte. 通常作为外码. 有以下优点:
* 与CPU字节顺序无关, 可以在不同平台之间交流
* 容错能力高, 任何一个字节损坏后, 最多只会导致一个编码码位损失, 不会链锁错误(如GB码错一个字节就会整行乱码)
UTF-16, 16bit编码, 是变长码, 大致相当于20位编码, 值在0到0x10FFFF之间, 基本上就是unicode编码的实现. 它是变长码, 与CPU字序有关, 但因为最省空间, 常作为网络传输的外码.
UTF-16是unicode的preferred encoding.
UTF-32, 仅使用了unicode范围(0到0x10FFFF)的32位编码, 相当于UCS-4的子集.

UTF与unicode的关系:
Unicode是一个字符集, 可以看作为内码.

而UTF是一种编码方式, 它的出现是因为unicode不适宜在某些场合直接传输和处理. UTF-16直接就是unicode编码,
没有变换, 但它包含了0x00在编码内, 头256字节码的第一个byte都是0x00, 在操作系统(C语言)中有特殊意义, 会引起问题.
采用UTF-8编码对unicode的直接编码作些变换可以避免这问题, 并带来一些优点.

中国国标编码:
GB 13000: 完全等同于ISO 10646-1/Unicode 2.1, 今后也将随ISO 10646/Unicode的标准更改而同步更改.
GBK: 对GB2312的扩充, 以容纳GB2312字符集范围以外的Unicode 2.1的统一汉字部分, 并且增加了部分unicode中没有的字符.
GB 18030-2000: 基于GB 13000, 作为Unicode 3.0的GBK扩展版本, 覆盖了所有unicode编码,
地位等同于UTF-8, UTF-16, 是一种unicode编码形式. 变长编码, 用单字节/双字节/4字节对字符编码.
GB18030向下兼容GB2312/GBK.
GB 18030是中国所有非手持/嵌入式计算机系统的强制实施标准.
分享到:
评论

相关推荐

    lua-utf8.zip

    Windows版:lua-utf8.dll(若是用在openresty中,openresty版本需使用32位版本,使用64位版本时会报错“lua-utf8.dll 不是有效的 Win32 应用程序”) 将lua-utf8库放在openresty安装目录下,使用时用require引入。

    批量转UTF8工具-批量转UTF8工具

    批量转UTF8工具批量转UTF8工具批量转UTF8工具批量转UTF8工具 批量转UTF8工具批量转UTF8工具批量转UTF8工具批量转UTF8工具

    CString转UTF8,UTF8转CString

    CString转UTF8,UTF8转CString。

    C++实现判断一个字符串是否为UTF8或GBK格式的方法

    本文实例讲述了C++实现判断一个字符串是否为UTF8或GBK格式的方法。分享给大家供大家参考,具体如下: 在处理外部数据的时候,很可能因为数据格式不一样而导致乱码,甚至导致某些程序挂掉。鉴于对多数系统来说,使用...

    全面了解mysql中utf8和utf8mb4的区别

    下面小编就为大家带来一篇全面了解mysql中utf8和utf8mb4的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    易语言UTF8解码

    易语言UTF8解码源码,UTF8解码

    md5_utf8.asp md5_utf8文件

    md5_utf8.asp md5_utf8文件

    UTF8BOM转换工具

    UTF8BOM转换工具

    JS GB2312转UTF8 支持中英文混合

    JS GB2312TOUTF8 UTF8TOGB2312 编码转换 /* * GB2312转UTF8 * 例: * var xx=new GB2312UTF8(); * var Utf8=xx.Gb2312ToUtf8("你aaa好aaaaa"); * var Gb2312=xx.Utf8ToGb2312(Utf8); * ...

    两个C++类:UTF8自动转换至Unicode,Unicode自动转换至UTF8

    两个C++类:UTF8自动转换至Unicode,Unicode自动转换至UTF8

    文本文件编码转换工具 gbk utf8 gb2312

    问题也是有的,在此环境下涉及到数据库运行的文件都必须是 utf8编码.这样一来就出现了不兼容,因为在国内大家都是以GBK gb2312编的码 包括 17PHP.com 网站里的学习源码文件(我用的是77例中的) 和很多插件 论坛代码......

    UTF8 to excel

    把xls文件名改为UTF8文件的文件名,再把UTF8文件拖到vbs文件上,就可以了

    utf8gb2312互转集成GB2312.txt

    例:utf8gb2312互转 /* * 例: * $xyy=new GB2312UTF8(); * $UTF8=$xyy->GB2312TOUTF8("i lover 你!"); * $GB2312=$xyy->UTF8TOGB2312($UTF8); * echo $UTF8." ".$GB2312; */

    lua utf8 unicode ansi 转换

    require "lc" print(lc.help());... u2w(utf8 to unicode) w2a(unicode to ansi) w2u(unicode to utf8) u2a(utf8 to ansi) a2u(ansi to utf8) bstr(bytes of str) help(show this) wunoman@qq.com 2012/03/06

    unicode和utf8编码相互转换C代码

    内容为utf8编码和unicode编码相互转换的C代码,关于utf8和unicode的用途另一篇博客有介绍,请参考。 压缩包 : ntf_code.rar 列表 ntf_code\uni_utf8.h ntf_code\utf8_u.c ntf_code\utf82u.c ntf_code\u2utf8.c ntf_...

    mysql数据库utf8转utf8mb4工具

    mysql数据库utf8转utf8mb4工具,将mysql数据库从utf8字符集转换为utf8mb4字符集,或将数据库从 utf8mb4字符集 转换为 utf8字符集。

    labview text to utf8

    labview默认的字符串中若存在汉字,发送给别人可能无法被别人正常解析,使用本模块可以将字符串转为utf8编码

    labview utf8toGBK

    使用labview时有时会遇到汉字乱码的情况,可能是因为汉字使用了UTF8编码,使用本模块可以成功解析

    文件编码转换(utf8与gbk相互转换)

    文件编码转换(utf8与gbk相互转换) 可以将utf8(gbk)的文件转换成gbk(utf8)格式

    JspSmartUpload_UTF8

    JspSmartUpload_UTF8版 增加了一个setCharset()方法 在upload()之前使用 例如: smartUpload = new SmartUpload(); smartUpload.initialize(config, request, response); smartUpload.setCharset("UTF-8"); ...

Global site tag (gtag.js) - Google Analytics