UTF-8是一種多位元組編碼的字符集,表示一個Unicode字元時,它可以是1個至多個位元組,在表示上有規律:
1位元組:0xxxxxxx
2位元組:110xxxxx 10xxxxxx
3位元組:1110xxxx 10xxxxxx 10xxxxxx
4位元組:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
這樣就可以根據上面的特徵對字串進行遍歷來判斷一個字串是不是UTF-8編碼了。應該指出的是UTF-8字串的各個位元組的取值有一定的範圍,並不是所有的值都是有效的UTF-8字元,但是一般的應用的情況下這樣的判斷在對足夠長的字串及是比較精確了,而且實現也比較簡單。具體的位元組取值範圍可以參見"Unicode Explained"一書中的6.4.3。
bool IsUTF8(const void* pBuffer, long size)
{
bool IsUTF8 = true;
unsigned char* start = (unsigned char*)pBuffer;
unsigned char* end = (unsigned char*)pBuffer + size;
while (start < end)
if (*start < 0x80) // (10000000): 值小於0x80的為ASCII字元
start++;
}
else if (*start < (0xC0)) // (11000000): 值介於0x80與0xC0之間的為無效UTF-8字元
IsUTF8 = false;
break;
else if (*start < (0xE0)) // (11100000): 此範圍內為2位元組UTF-8字元
if (start >= end - 1)
if ((start[1] & (0xC0)) != 0x80)
start += 2;
else if (*start < (0xF0)) // (11110000): 此範圍內為3位元組UTF-8字元
if (start >= end - 2)
if ((start[1] & (0xC0)) != 0x80 || (start[2] & (0xC0)) != 0x80)
start += 3;
else
return IsUTF8;
UTF- 16以16位為單元對UCS進行編碼。對於小於0x10000的UCS碼,UTF-16編碼就等於UCS碼對應的16位無符號整數。對於不小於 0x10000的UCS碼,定義了一個演算法。不過由於實際使用的UCS2,或者UCS4的BMP必然小於0x10000,所以就目前而言,可以認為UTF -16和UCS-2基本相同。但UCS-2只是一個編碼方案,UTF-16卻要用於實際的傳輸,所以就不得不考慮位元組序的問題。
UTF-8是一種多位元組編碼的字符集,表示一個Unicode字元時,它可以是1個至多個位元組,在表示上有規律:
1位元組:0xxxxxxx
2位元組:110xxxxx 10xxxxxx
3位元組:1110xxxx 10xxxxxx 10xxxxxx
4位元組:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
這樣就可以根據上面的特徵對字串進行遍歷來判斷一個字串是不是UTF-8編碼了。應該指出的是UTF-8字串的各個位元組的取值有一定的範圍,並不是所有的值都是有效的UTF-8字元,但是一般的應用的情況下這樣的判斷在對足夠長的字串及是比較精確了,而且實現也比較簡單。具體的位元組取值範圍可以參見"Unicode Explained"一書中的6.4.3。
bool IsUTF8(const void* pBuffer, long size)
{
bool IsUTF8 = true;
unsigned char* start = (unsigned char*)pBuffer;
unsigned char* end = (unsigned char*)pBuffer + size;
while (start < end)
{
if (*start < 0x80) // (10000000): 值小於0x80的為ASCII字元
{
start++;
}
else if (*start < (0xC0)) // (11000000): 值介於0x80與0xC0之間的為無效UTF-8字元
{
IsUTF8 = false;
break;
}
else if (*start < (0xE0)) // (11100000): 此範圍內為2位元組UTF-8字元
{
if (start >= end - 1)
break;
if ((start[1] & (0xC0)) != 0x80)
{
IsUTF8 = false;
break;
}
start += 2;
}
else if (*start < (0xF0)) // (11110000): 此範圍內為3位元組UTF-8字元
{
if (start >= end - 2)
break;
if ((start[1] & (0xC0)) != 0x80 || (start[2] & (0xC0)) != 0x80)
{
IsUTF8 = false;
break;
}
start += 3;
}
else
{
IsUTF8 = false;
break;
}
}
return IsUTF8;
}
UTF- 16以16位為單元對UCS進行編碼。對於小於0x10000的UCS碼,UTF-16編碼就等於UCS碼對應的16位無符號整數。對於不小於 0x10000的UCS碼,定義了一個演算法。不過由於實際使用的UCS2,或者UCS4的BMP必然小於0x10000,所以就目前而言,可以認為UTF -16和UCS-2基本相同。但UCS-2只是一個編碼方案,UTF-16卻要用於實際的傳輸,所以就不得不考慮位元組序的問題。