Chinaunix首页 | 论坛 | 博客
  • 博客访问: 651004
  • 博文数量: 195
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 894
  • 用 户 组: 普通用户
  • 注册时间: 2015-09-21 16:48
文章分类

全部博文(195)

文章存档

2024年(1)

2023年(1)

2022年(3)

2021年(16)

2020年(4)

2019年(5)

2018年(10)

2017年(72)

2016年(36)

2015年(47)

我的朋友

分类: 嵌入式

2019-11-14 10:26:38

UTF,是Unicode Text Format的缩写,意为Unicode文本格式。根据Unicode的编码可以生成UTF编码,转换规则如下:
  首先将Unicode的编码转换成二进制形式,这样一个字符对应一个16位的二进制数。
 如果Unicode的16位二进制编码的头9位都是0,则用一个字节表示该字符,这个字节的首位是“0”,剩下的7位与原编码中的后7位相同。例如“/u0034”(0000 0000 0011 0100),用“34” (0011 0100)表示(与原Unicode编码是相同的,只是去掉了原编码的首字节;
 如果Unicode的16位二进制编码的头5位都是0,则用两个字节表示该字符,首字节以“110”开头,该字节后面的5位与源编码中头5个零后面的5位相同;第二个字节以“10”开头,后面的六位则与源编码中剩下的6位相同。例如“/u025d”(0000 0010 0101 1101),转化后为“c99d”(1100 1001 1001 1101);
 如果Unicode的16位二进制编码不符合上述两个规则,则用三个字节表示该字符。第一个字节以“1110”开头,后四位与源编码的头4位相同;第二个字节以“10”开头,后六位与原编码接下来的6位相同;第三个字节也以“10”开头,后六位与原编码剩下的6位相同,这样原来16位的编码就转换成三个字节24位的编码了;例如“/u9da7”(1001 1101 1010 0111),转化为“e9b6a7”(1110 1001 1011 0110 1010 0111)。


   目前我接触最多的是gb2312和utf8编码。gb码的第一个字是“啊”,其内码是1601。gb码用两各字节保存一个汉字,用ord函数可以看到“啊”的字符编码是176,161。也可以看成是160+16,160+1,用16进制表示就是A0+10,A0+1。所以汉字的gb码就是把内码拆开分别再加上A0。看了下gb编码表,高位的最大数是87(16进制是57),而且不管是高位还是低位,都不会大于5F,否则会溢出.事实上,gb2312的编码范围是E0A1-F7FE,其中D7FA-D7FE是空的。但是utf8编码表找不到。只有unicode的汉字编码表。utf8虽然与gb码不能相互转换但是可以和unicode码转换。
    UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:


 UCS-2编码(16进制)
 UTF-8 字节流(二进制)




 0000 - 007F  0xxxxxxx


 0080 - 07FF 110xxxxx 10xxxxxx
 


 0800 - FFFF  1110xxxx 10xxxxxx 10xxxxxx


     例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。


 事实上unicode的汉字编码范围是4e00-9fa5,中、日、韩的三种文字占用了Unicode中0x3000到0x9FFF的部分。全都在0800-FFFF区间内,所以都是三个字节的.
————————————————
版权声明:本文为CSDN博主「baozhongchao」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baozhongchao/article/details/4446600
阅读(258290) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~