UTF-8编码

摘要:
UTF-8是UNICODE的一种变长度的编码表达方式《一般UNICODE为双字节》,它由KenThompson于1992年创建,现在已经标准化为RFC3629。UTF-8就是以8位为单元对UCS进行编码,而UTF-8不使用大尾序和小尾序的形式,每个使用UTF-8存储的字符,除了第一个字节外,其余字节的头两个位都是以"10"开始,使文字处理器能够较快地找出每个字符的开始位置。在UTF-8文件的开首,很多时都放置一个U+FEFF字符,以显示这个文字文件是以UTF-8编码。

UTF-8是UNICODE的一种变长度的编码表达方式《一般UNICODE为双字节(指UCS2)》,它由Ken Thompson于1992年创建,现在已经标准化为RFC 3629。UTF-8就是以8位为单元对UCS进行编码,而UTF-8不使用大尾序和小尾序的形式,每个使用UTF-8存储的字符,除了第一个字节外,其余字节的头两个位都是以"10"开始,使文字处理器能够较快地找出每个字符的开始位置。

但为了与以前的ASCII码兼容(ASCII为一个字节),因此UTF-8选择了使用可变长度字节来存储Unicode:

ISO8859-1:一个字节

GBK: 两个字节包含了英文字符和扩展的中文ISO8859-1+中文字符

UTF-8 万国码:1~3个字节不等长。英文存的是1个字节,中文存的是3个字节,是为了节省空间。

UCS-4编码UTF-8字节流
U+00000000 – U+0000007F0xxxxxxx
U+00000080 – U+000007FF110xxxxx 10xxxxxx
U+00000800 – U+0000FFFF1110xxxx 10xxxxxx 10xxxxxx
U+00010000 – U+001FFFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U+00200000 – U+03FFFFFF111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U+04000000 – U+7FFFFFFF1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  • 在ASCII码的范围,用一个字节表示,超出ASCII码的范围就用字节表示,这就形成了我们上面看到的UTF-8的表示方法,这様的好处是当UNICODE文件中只有ASCII码时,存储的文件都为一个字节,所以就是普通的ASCII文件无异,读取的时候也是如此,所以能与以前的ASCII文件兼容。
  • 大于ASCII码的,就会由上面的第一字节的前几位表示该unicode字符的长度,比如110xxxxxx前三位的二进制表示告诉我们这是个2BYTE的UNICODE字符;1110xxxx是个三位的UNICODE字符,依此类推;xxx的位置由字符编码数的二进制表示的位填入。越靠右的x具有越少的特殊意义。只用最短的那个足够表达一个字符编码数的多字节串。注意在多字节串中,第一个字节的开头"1"的数目就是整个串中字节的数目。。

ASCII字母继续使用1字节存储,重音文字希腊字母西里尔字母等使用2字节来存储,而常用的汉字就要使用3字节。辅助平面字符则使用4字节。

在UTF-8文件的开首,很多时都放置一个U+FEFF字符(UTF-8以EF,BB,BF代表),以显示这个文字文件是以UTF-8编码。

免责声明:文章转载自《UTF-8编码》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python实现labelme样本自动标注linux编译安装时常见错误解决办法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

CString之Find()、FindOneOf()、ReverseFind()

一、CString之Find()、FindOneOf()、ReverseFind() 此三个函数返回值均为整数int。 1、Find() 该函数从左侧0索引开始,查找第一个出现的字符位置,返回position。示例如下: 1 CString s("abcd"); 2 ASSERT( s.Find('b') == 1 ); 返回值:...

java字符编码和oracle乱码

编码问题我仍旧没搞懂,最根本的从哪里来就没搞懂。当页面发送请求,编码到后台是什么编码呢?好吧,我默认的都是utf-8.后台接收参数后,可以在控制台打印出来,我也不清楚是什么编码。然后,就是数据库问题。 在mysql数据库,首先会设置mysql安装的字符集为utf-8,然后在连接的jdbc上注明characterEncoding是utf-8.一直这样统一下去...

MySQL中REGEXP正则表达式使用大全

REGEXP在mysql是用来执行正则表达式的一个函数 像php中的preg之类的函数了,regexp正则函数如果只是简单的查询使用like即可,但复杂的还是需要使用regexp了,下面我们来看看。 MySql用户手册建议,在构造简单查询时,仍使用通配符。 如:Select [*|fieldname list] From [tablename] whe...

算法训练 字符删除

算法训练 字符删除 时间限制:1.0s 内存限制:512.0MB 问题描述编写一个程序,先输入一个字符串str(长度不超过20),再输入单独的一个字符ch,然后程序会把字符串str当中出现的所有的ch字符都删掉,从而得到一个新的字符串str2,然后把这个字符串打印出来。输入格式:输入有两行,第一行是一个字符串(内部没有空格),第二行是一个字...

IOS开发NSString与int和float的相互转换以及字符串拼接、NSString、NSData、char* 类型之间的转换

一、NSString与int和float的相互转换 NSString *tempA = @"123"; NSString *tempB = @"456"; 1.字符串拼接 NSString *newString = [NSString stringWithFormat:@"%@%@",tempA,tempB]; 2.字符转intint intStr...

mysql5.6和8.0中都没有len()函数,获取字符串长度的函数是length()

mysql5.6和8.0中都没有len()函数,而是length()或char_length() 返回user表password列中记录的长度 select length(password) from user 取用户名小于6位的记录: SELECT * FROM admin WHERE LENGTH(username) < 6 简单的总结来说,my...