UTF8 编码解析/解码(附加代码)
2012-08-06 09:11
323 查看
最近在用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******
............................................
..............................................
明白了没有?
编码的方法是从低位到高位
现在就让我们来看看实例吧!
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;}
}
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******
............................................
..............................................
明白了没有?
编码的方法是从低位到高位
现在就让我们来看看实例吧!
黄色为标志位 其它着色为了显示其,编码后的位置
|
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;}
}
相关文章推荐
- UTF8 编码解析/解码(附加代码) .
- Nginx将utf8编码的url解码成\x的16进制格式导致无法匹配静态文件的问题处理
- Dubbo中编码和解码的解析
- php base64 编码与解码实例代码
- 使用Java对UTF8URL进行编码解码以及进行编码方式的判断
- Java实现的utf8,gbk,unicode编码相互转换的代码
- Base64在线编码解码实现代码 演示与下载
- 字符串编码解析代码分析
- 24. Dubbo原理解析-编码解码之编码解码流程
- base64编码解码代码
- NIO框架之MINA源码解析(四):粘包与断包处理及编码与解码
- 音视频同步原理解析;音频编码和解码原理
- 用XMLDOM和ADODB.Stream实现base64编码解码实现代码
- PHP写入WRITE编码为UTF8的文件的实现代码
- 音视频同步原理解析;音频编码和解码原理
- 解析JM代码比较理解H264语法元素解码ue(v),se(v),u(n)
- XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
- 解析UTF8字符串,并截取每个字符到vector(C++代码)
- FVC/JEM代码学习9:解码框架解析
- xmlhttp 乱码 比较完整的解决方法 (UTF8,GB2312 编码 解码)