UTF8 编码解析/解码(附加代码) .

来源:互联网 发布:域名dns解析 编辑:程序博客网 时间:2024/06/05 03:29

本文转载自  http://blog.csdn.net/caoxinst/article/details/7833814  希望他允许我转载他的文章

 最近在用cocos2d -x 做一个带滑动条的TextField(完成之后会公布出来)!!顺便了解了一下UTF8的编码格式!!

  UTF8编码格式!一定要了解!

  它其实和Unicode是同类,就是在编码方式上不同!
   首先UTF8编码后的大小是不一定,不像Unicode编码后的大小是一样的!
  我们先来看Unicode的编码:一个英文字母和 一个汉字 在编码后都是占用的空间大小是一样的,都是两个字节!而UTF8编码:一个英文字母 和 一个汉字,编码后占用的空间大小就不样了,前者是一个字节,后者是三个字节!
    因为一个字母还有一些键盘上的符号加起来只用二进制七位就可以表示出来,而一个字节就是八位,所以UTF8就用一个字节来表式字母和一些键盘上的符号。然而当我们拿到被编码后的一个字节后怎么知道它的组成?它有可能是英文字母的一个字节,也有可能是汉字的三个字节中的一个字节!所以,UTF8是有标志位 的!
    当要表示的内容是 7位 的时候就用一个字节:0*******  第一个0为标志位,剩下的空间正好可以表示ASCII 0-127 的内容。当要表示的内容在 8 到 11 位的时候就用两个字节:110***** 10******  第一个字节的110和第二个字节的10为标志位。当要表示的内容在 12 到 16 位的时候就用三个字节:1110***** 10****** 10******  和上面一样,第一个字节的1110和第二、三个字节的10都是标志位,剩下的空间正好可以表示汉字。

以此类推:

  四个字节:11110**** 10****** 10****** 10******
  五个字节:111110*** 10****** 10****** 10****** 10******
  六个字节:1111110** 10****** 10****** 10****** 10****** 10******
  ............................................
  ..............................................
  明白了没有?
  编码的方法是从低位到高位
   现在就让我们来看看实例吧!

    黄色为标志位
    其它着色为了显示其,编码后的位置

Unicode十六进制

Unicode二进制

UTF8二进制

UTF8十六进制

UTF8字节数

B

00001011

00001010

B

1

9D

00010011101

11000010 10011101

C2 9D

2

A89E

10101000 10011110

11101010 10100010 10011110

EA A2 9E

3

UTF8 字符串解析!!代码如下:

void parseUTF8(string sin,std::list<string> &msgList){   int l = sin.length();    for(int p = 0; p < l; ) {      int size,;      unsigned char c = sin[p];      if(c < 0x80) {         size = 1;//占一个字节      } else if(c < 0xc2) {      } else if(c < 0xe0) {         size = 2;//占2个字节      } else if(c < 0xf0) {         size = 3;      } else if(c < 0xf8) {         size = 4;      } else if (c < 0xfc) {         size = 5;      } else if (c < 0xfe) {         size = 6;      }         string temp = "";        temp = sin.substr(p, size);        msgList.push_back(temp);        p += size;}}