迅雷笔试题的Utf-8编码检测的实现



程序中用移位运算来判断,之后觉得没必要,编码完全可以理解为如下表格:

0000-007F0XXXXXXX0~127
0080-07FF110XXXXX
10XXXXXX
192~223
128~191
0800-FFFF1110XXXX
10XXXXXX
10XXXXXX
224~239
128~191
128~191

直接将unsigned char 转换为 unsigned int ,然后判断大小即可。程序还是沿用移位运算:


#include "stdafx.h"
#include <iostream>
using namespace std;

int calc_utf8_count(unsigned char* data_ptr,unsigned int data_len)
{
	int countOfByte=0;

	if (data_len==0||data_ptr==NULL)
	{
		return 0;
	}

	int curNumByte=0;
    unsigned char curByte=NULL;
	while(curNumByte<data_len)
	{
		curByte=data_ptr[curNumByte];
		if (!(curByte>>7))
		{//说明第一位是0,属于第一种情况
			countOfByte++;
			curNumByte++;
			continue;
		}
		if ((curByte>>5)==6||(curByte>>5)==7)
		{//是以110或111开头
			if ((curByte>>5)==6)
			{//以110开头,属于第二种
				curByte=data_ptr[++curNumByte];
				if ((curByte>>6)==2)
				{//后面的字节以10开头,说明合法
					countOfByte++;
					curNumByte++;
				} 
				else
				{
					return -1;
				}
			} 
			else
			{//以111开头,可能属于第三种
				if ((curByte>>4)==14)
				{//以1110开头,属于第三种
					curByte=data_ptr[++curNumByte];
					if ((curByte>>6)==2)
					{//后面的字节以10开头
						curByte=data_ptr[++curNumByte];
						if ((curByte>>6)==2)
						{//第三个字节以10开头
							countOfByte++;
							curNumByte++;
						} 
						else
						{
							return -1;
						}
					} 
					else
					{
						return -1;
					}
				} 
				else
				{
					return -1;
				}
			}
			
		}
		else
			return -1;
	}

	return countOfByte;
}

int _tmain(int argc, _TCHAR* argv[])
{
	unsigned char data[] = {0x79,0xC0,0x80,0xE0,0x80,0x80,0x78};

	cout<<calc_utf8_count(data,7)<<endl;

	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值