(回転)文字列がUTF 8符号化であるか否かをどのように判断するか

1690 ワード

UTF 8は、8 bitsである1 Bytesを符号化する最も基本的な単位であり、もちろん、16 bitsと32 bitsに基づく形式で、それぞれUTF 16とUTF 32と呼ぶこともできるが、現在はあまり使われていないが、UTF 8はファイル格納とネットワーク伝送に広く応用されている.
コーディングの原理
まずこのテンプレートを見てください.
  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)まず8 bits(octets)が何個必要かを決定する
2)上記テンプレートに従って各octetsの上位ビットを充填する
3)文字のbitsをxに埋め、文字順:下位→上位、UTF 8順:最後のoctetの最下位x→最初のoctetの最上位x
UTF 8符号化によれば、最大6バイトで構成することができるので、UTF 8は1~6バイト符号化で構成される
BOOL IsTextUTF8(char* str,ULONGLONG length)
{
	DWORD nBytes=0;//UFT8 1-6 ,ASCII 
	UCHAR chr;
	BOOL bAllAscii=TRUE; // ASCII,  UTF-8
	for(int i=0; i<length; ++i)
	{
		chr= *(str+i);
		if( (chr&0x80) != 0 ) //  ASCII , , UTF-8,ASCII 7 , , 0,o0xxxxxxx
			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;
} 

変換元:http://blog.csdn.net/woshinia/article/details/8137436