C++判断字符串是否为UTF8编码

UTF8是以8bits即1Bytes为编码的最基本单位,当然也可以有基于16bits和32bits的形式,分别称为UTF16和UTF32,但目前用得不多,而UTF8则被广泛应用在文件储存和网络传输中。

  编码原理

  先看这个模板:

  UCS-4 range (hex.) UTF-8 octet sequence (binary)

  0000 0000-0000 007F 0xxxxxxx

  0000 0080-0000 07FF 110xxxxx 10xxxxxx

  0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx

  0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

  0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

  0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx

  编码步骤:

  1) 首先确定需要多少个8bits(octets)

  2) 按照上述模板填充每个octets的高位bits

  3) 把字符的bits填充至x中,字符顺序:低位→高位,UTF8顺序:最后一个octet的最末位x→第一个octet最高位x

  根据UTF8编码,最多可由6个字节组成,所以UTF8是1-6字节编码组成

int IsTextUTF8(char* str,ULONGLONG length)
{
	int i;
	DWORD nBytes=0;//UFT8可用1-6个字节编码,ASCII用一个字节
	UCHAR chr;
	BOOL bAllAscii=TRUE; //如果全部都是ASCII, 说明不是UTF-8

	for(i=0;i<length;i++)
	{
		chr= *(str+i);

		// 判断是否ASCII编码,如果不是,说明有可能是UTF-8,ASCII用7位编码,但用一个字节存,最高位标记为0,o0xxxxxxx
		if( (chr&0x80) != 0 )
			bAllAscii= FALSE;

		if(nBytes==0) //如果不是ASCII码,应该是多字节符,计算字节数
		{
			if(chr>=0x80)
			{
				if(chr>=0xFC&&chr<=0xFD)
					nBytes=6;
				else if(chr>=0xF8)
					nBytes=5;
				else if(chr>=0xF0)
					nBytes=4;
				else if(chr>=0xE0)
					nBytes=3;
				else if(chr>=0xC0)
					nBytes=2;
				else
				{
					return FALSE;
				}
				nBytes--;
			}
		}
		else //多字节符的非首字节,应为 10xxxxxx
		{
			if( (chr&0xC0) != 0x80 )
			{
				return FALSE;
			}
			nBytes--;
		}
	}

	if( nBytes > 0 ) //违返规则
	{
		return FALSE;
	}

	if( bAllAscii ) //如果全部都是ASCII, 说明不是UTF-8
	{
		return FALSE;
	}

	return TRUE;
}
时间: 2024-08-30 10:42:42

C++判断字符串是否为UTF8编码的相关文章

判断字符串是否为 utf-8 编码

代码清单: <?php /** * 判断字符串是否为utf8编码,英文和半角字符返回ture * @author ruxing.li * @param $string * @return bool */ function is_utf8($string) { return preg_match('%^(?: [\x09\x0A\x0D\x20-\x7E] # ASCII | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte | \xE0[\xA0-\xBF

判断字符串是否为UTF8编码

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码.由Ken Thompson于1992年创建.现在已经标准化为RFC 3629.UTF-8用1到4个字节编码Unicode字符.用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文). <?php /** *检查字符串是否是utf8编码 *@param string $string 被检测字符串 *@return Boolean */ function i

如何识别字符串是否是UTF-8编码的

我们先要弄明白原始字符串里的字符用的是何种编码方式,运行如下 string tmp = "你好world"; for(int i=0;i<tmp.size();++i) { printf("%0X ",tmp.at(i)); } 程序输出: FFFFFFE4 FFFFFFBD FFFFFFA0 FFFFFFE5 FFFFFFA5 FFFFFFBD 77 6F 72 6C 64很明显,原始的字符串是使用UTF-8编码的,因为它满足UTF-8的编码规则: 1)对于

字符串转换成utf-8编码

a.将字符串转换成utf-8编码的字节,并输出,然后将该字节在转换成utf-8编码字符串,在输出 b.将字符串转换后才能gbk编码的字节,并输出,然后将该字节在转换成gbk编码字符串,在输出 def main():     n = "老男孩"     nBytes_utf = n.encode('utf-8')     nStr_utf = nBytes_utf.decode('utf-8')     print(nBytes_utf)     print(nStr_utf)     

如何判断字符串所用何种加密编码

base64.base32.base16 区别: 1.Base64编码是使用64个可打印ASCII字符(A-Z.a-z.0-9.+./)将任意字节序列数据编码成ASCII字符串,另有“=”符号用作后缀用途. 2.Base32编码是使用32个可打印字符(A-Z.2-7)对任意字节数据进行编码的方案. 3.Base16编码使用16个ASCII可打印字符(数字0-9和字母A-F)对任意字节数据进行编码 未完待续...... 原文地址:https://www.cnblogs.com/HKCZ/p/109

XE3随笔16:将字符串转换成 UTF8 编码的函数

这种转换一般用于网页地址; 我不知道 Delphi 是不是有现成的函数, 用到了就写了一个. //函数: function ToUTF8Encode(str: string): string; var   b: Byte; begin   for b in BytesOf(UTF8Encode(str)) do     Result := Format('%s%%%.2x', [Result, b]); end; //测试: var   str: string; begin   str := '

PHP判断字符串编码是否为utf8以及转换问题

今天说说编码乱码问题,当一个页面存在两种编码的时候,无论你乍么选择都会出现乱码,解决方法: 1.你据在网页编码是哪个. 2.首先判断字符串编码是否为utf8代码如下: PHP代码 function is_utf8($word) { if (preg_match("/^([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128

判断字符串是否UTF8编码

UTF-8的编码规则很简单,只有二条: 1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码.因此对于英语字母,UTF-8编码和ASCII码是相同的. 2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10.剩下的没有提及的二进制位,全部为这个符号的unicode码. 举个例子,已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内 (0000 0800-0

萌新笔记——C++里将string类字符串(utf-8编码)分解成单个字(可中英混输)

最近在建词典,使用Trie字典树,需要把字符串分解成单个字.由于传入的字符串中可能包含中文或者英文,它们的字节数并不相同.一开始天真地认为中文就是两个字节,于是很happy地直接判断当前位置的字符的ASCII码是否处于0~127之间,如果是就提取一个字符,否则提取两个.在测试分字效果的时候,这种方法出了问题.比如我传一个"abcde一二三四五"进去,abcde可以正常分解成 a b c d e,而后面的"一二三四五"则成了乱码. 于是我开启了谷歌之旅,搜索"