UTF8

转载 2007年09月12日 13:13:00
UTF8并不算是一种电脑编码,而是一种储存和传送的格式,如前所述,每个Unicode/UCS字符都以 2或4个bytes来储存,看看以下的比较:

以"I am Chinese"为例
用ANSI储存:12 Bytes
用Unicode/UCS2储存:24 Bytes + 2 Bytes(header)
用UCS4储存:48 Bytes + 4 Bytes(header)

以"我是中国人"为例
用ANSI储存:10 Bytes
用Unicode/UCS2储存:10 Bytes + 2 Bytes(header)
用UCS4储存:20 Bytes + 4 Bytes(header)

由此可见直接以Unicode/UCS的原始形式来储存是一种极大的浪费,而且也不利于互联网的传输(中文稍为合算一点^_^)。

有见及此,Unicode/UCS的压缩形式--UTF8出现了,套用官方网站的首句话『UTF-8 stands for Unicode Transformation Format-8. It is an octet (8-bit) lossless encoding of Unicode characters.』,由于UTF也适用于编码UCS,故亦可称为『UCS transformation formats (UTF)』

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.泛欧语系、斯拉夫语字母占2 Bytes;
3.汉字占3 Bytes。

由此可见UTF8对英文来说是个非常诱人的方案,但对中文来说则不太合算,无论用ANSI还是 Unicode/UCS2来编码都只用2 Bytes,但用UTF8则需要3 Bytes。

以下是一些统计资料,显示用UTF8来储存文件每个字符所需的平均字节:
1.拉丁语系平均用1.1 Bytes;
2.希腊文、俄文、阿拉伯文和希伯莱文平均用1.7 Bytes;
3.其他大部份文字如中文、日文、韩文、Hindi(北印度语)用约3 Bytes;
4.用超过4 Bytes的都是些非常少用的文字符号。

参考资料:http://www.renzhiyuan.com/article.asp?id=135
 

C++处理UTF8编码的字符串

在windows下打开一个记事本,保存文件,下面有四种编码选择: ①ANSI,也就是多字节字符集,在中文系统下约等于GB2312。 ②Unicode,就是UTF16 LE,小端序存储的UTF16。 ③...
  • CharlesSimonyi
  • CharlesSimonyi
  • 2013年03月26日 21:57
  • 19546

GB2312转UTF8编码表

static T_GB2312ToUTF T_GB2312ToUTFArray[]= { {0xD2BB,0x4E00,0xE4,0xB8,0x80}, //一 {0xB6A1,0x4...
  • huangjiancald
  • huangjiancald
  • 2015年10月29日 22:45
  • 785

utf8与ucs2编码互转及原理

原文:http://liangguanhui.iteye.com/blog/558849 我们都知道对于UNICODE来说,UCS-2是内码,而UTF-8则是它的实现方式。每一个字节都有8个...
  • macrohasdefined
  • macrohasdefined
  • 2013年10月18日 12:46
  • 731

UTF8字符串的判断

UTF8字符串的判断  最近验证一个技术问题,中间遇到了自动判断给定字符串是否是UTF8字符串的问题,现将用到的相关信息,整理下来。 首先要明白UTF8其实是对UNICODE数值的一种...
  • NetDraw
  • NetDraw
  • 2015年09月10日 10:41
  • 649

锟斤拷?UTF-8与GBK互转,为什么会乱码?

中文乱码是怎么产生的,编码转换是怎么回事,编码转换中有哪些需要注意的,本文为你解答!...
  • u010234516
  • u010234516
  • 2016年10月18日 21:50
  • 13564

字符串是否是UTF8,UTF8汉字是否被截断?

UTF8是以8bits即1Bytes为编码的最基本单位,当然也可以有基于16bits和32bits的形式,分别称为UTF16和UTF32,但目前用得不多,而UTF8则被广泛应用在文件储存和网络传输中。...
  • zimu2702
  • zimu2702
  • 2013年12月06日 20:42
  • 2260

跨平台utf8与unicode的互转

这几天帮同事看一个聊天敏感词过滤问题,需求是在ndk环境下,把用户输入的句子中不健康的词语替换成*,一开始时先将用户输入用mbstowcs函数转成wchar_t*,在本地linux环境下测试没有问题,...
  • u013353142
  • u013353142
  • 2014年01月02日 02:30
  • 374

c++读取utf8等不同编码文件

今天写程序的时候遇到文件打开乱码的情况,我用notepad++打开发现是utf8编码的,后来上网查了一下,utf8是变长的,一般情况下文件开头有个BOM(Byte Order Mark)作为标识,一般...
  • u011320646
  • u011320646
  • 2013年09月18日 22:51
  • 3230

UTF8编码-变长编码

我相信很多很我一样做挨踢业的人在初期都免不了遇上乱码之类的问题,相信在很多次之后都会对编码有些了解,其实编码和很多这方面的知识一样,你乍一看他挺繁琐,晦涩难懂。不过只要你理解了其中的必然性,从制定者的...
  • yangzhen19900701
  • yangzhen19900701
  • 2014年04月08日 01:33
  • 2342

UTF-8编码占几个字节?

占2个字节的:带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要二个字节编码 占3个字节的:基本等同于GBK,含21000多个汉字 占4个字节的:中日韩...
  • bluetjs
  • bluetjs
  • 2016年10月26日 18:27
  • 17026
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UTF8
举报原因:
原因补充:

(最多只允许输入30个字)