(回転)文字列が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バイト符号化で構成される
変換元:http://blog.csdn.net/woshinia/article/details/8137436
コーディングの原理
まずこのテンプレートを見てください.
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