UTF-8到Unicode的转换以及UTF-8编码的检测

UTF-8到Unicode的转换和UTF-8编码的检测思路是一样的,转换是一个不完全的检测,而检测则是一遇到错误立刻退出循环

16位Unicode(无视32位Unicode了)到UTF-8的映射关系

U-0000 – U-007F: 0xxxxxxx
U-0080 – U-07FF: 110xxxxx 10xxxxxx
U-0800 – U-FFFF: 1110xxxx 10xxxxxx 10xxxxxx

转换函数

CString UTF8toUnicde(const char* utf8Str,UINT length)
{
	CString unicodeStr;
	unicodeStr=_T("");
	//转换
	WCHAR chr=0;
	for (UINT i=0;i<length;)
	{
		if ((0x80&utf8Str[i])==0) // ASCII
		{
			chr=utf8Str[i];
			i++;
		}
		else if((0xE0&utf8Str[i])==0xC0) // 110xxxxx 10xxxxxx
		{
			chr =(utf8Str[i+0]&0x3F)<<6;
			chr|=(utf8Str[i+1]&0x3F);
			i+=2;
		}
		else if((0xF0&utf8Str[i])==0xE0) // 1110xxxx 10xxxxxx 10xxxxxx
		{
			chr =(utf8Str[i+0]&0x1F)<<12;
			chr|=(utf8Str[i+1]&0x3F)<<6;
			chr|=(utf8Str[i+2]&0x3F);
			i+=3;
		}
		else // 不是UTF-8字符串
		{
			return unicodeStr;
		}
		unicodeStr.AppendChar(chr);
	}
	return unicodeStr;
}

判断函数,参数和上面是相同的

BOOL CheckUTF8(const char* AnsiStr,UINT length)
{
	UINT i=0;
	BOOL isUTF8=TRUE;
	while (i<length)
	{
		if ((0x80&AnsiStr[i])==0) // ASCII
		{
			i++;
			continue;
		}
		else if((0xE0&AnsiStr[i])==0xC0) // 110xxxxx
		{
			if (AnsiStr[i+1]=='\0')
			{
				isUTF8=FALSE;
				break;
			}
			if ((0xC0&AnsiStr[i+1])==0x80) // 10xxxxxx
			{
				i+=2;
				continue;
			}
			else
			{
				isUTF8=FALSE;
				break;
			}
		}
		else if((0xF0&AnsiStr[i])==0xE0) // 1110xxxx
		{
			if (AnsiStr[i+1]=='\0')
			{
				isUTF8=FALSE;
				break;
			}
			if (AnsiStr[i+2]=='\0')
			{
				isUTF8=FALSE;
				break;
			}
			if (((0xC0&AnsiStr[i+1])==0x80)&&((0xC0&AnsiStr[i+2])==0x80)) // 10xxxxxx 10xxxxxx
			{
				i+=3;
				continue;
			}
			else
			{
				isUTF8=FALSE;
				break;
			}
		}
		else // 不是UTF-8字符串
		{
			isUTF8=FALSE;
			break;
		}
	}
	return isUTF8;
}
2010年6月6日 | 归档于 程序
标签: , ,

发表评论

XHTML: 您可以使用这些标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!: