UTF 8符号化規則及びC++言語による認識
UTF-8符号化規則
UTF-8は、変長バイト符号化方式である.ある文字のUTF-8符号化について、1バイトしかない場合、その最高バイナリビットは0である.マルチバイトであれば、その最初のバイトが最上位から始まり、連続するバイナリビット値が1の個数が符号化のビット数を決定し、残りの各バイトは10で始まる.UTF-8は最大6バイトまで使用可能です.
表のように:
1バイト0 xxxxxxx
2バイト110 xxxxx 10 xxxxx
3バイト1110 xxxx 10 xxxxxx 10 xxxxxx
4バイト11110 xxx 10 xxx 10 xxx 10 xxx 10 xxx 10 xxx
5バイト111110 xxx 10 xxxxx 10 xxxxxxx 10 xxxxx 10 xxxxx
6バイト1111110 x 10 xxxxxxx 10 xxxxxxxxx 10 xxxxxxx 10 xxxxxxx 10 xxxxxxx
従って、UTF-8において文字符号化を表すために用いられる実際のビット数は、最大31ビット、すなわち、上の表xに示すビットである.これらの制御ビット(バイトごとに先頭の10等)を除いて、これらxが表すビットはUNICOD符号化に1つずつ対応しており、ビット高低順序も同じである.
実際にUNICodeをUTF-8符号化に変換する場合は、まず上位0を除去し、残りの符号化ビット数に基づいて必要最小のUTF-8符号化ビット数を決定する.
したがって、基本的なASCII文字セットの文字(UNICode互換ASCII)は、1バイトのUTF-8符号化(7バイナリビット)で表すことができる.
文字列がUTF-8符号化されたコードであるか否かを判断する
今ネット上でいくつかの判断のアルゴリズムがあって、しかし最后にすべて判断が正确ではありませんと言って、その原因を究明してコードが书き间违って、ははは、ウェブサイトの中のプログラムを参考にして、みんなは见ることができます.
以下は私が書いた正しいコードです.
参考文献:
http://blog.csdn.net/sandyen/article/details/1108168
http://archive.cnblogs.com/a/1914592/
http://www.zxbc.cn/html/20081125/68270.html
UTF-8は、変長バイト符号化方式である.ある文字のUTF-8符号化について、1バイトしかない場合、その最高バイナリビットは0である.マルチバイトであれば、その最初のバイトが最上位から始まり、連続するバイナリビット値が1の個数が符号化のビット数を決定し、残りの各バイトは10で始まる.UTF-8は最大6バイトまで使用可能です.
表のように:
1バイト0 xxxxxxx
2バイト110 xxxxx 10 xxxxx
3バイト1110 xxxx 10 xxxxxx 10 xxxxxx
4バイト11110 xxx 10 xxx 10 xxx 10 xxx 10 xxx 10 xxx
5バイト111110 xxx 10 xxxxx 10 xxxxxxx 10 xxxxx 10 xxxxx
6バイト1111110 x 10 xxxxxxx 10 xxxxxxxxx 10 xxxxxxx 10 xxxxxxx 10 xxxxxxx
従って、UTF-8において文字符号化を表すために用いられる実際のビット数は、最大31ビット、すなわち、上の表xに示すビットである.これらの制御ビット(バイトごとに先頭の10等)を除いて、これらxが表すビットはUNICOD符号化に1つずつ対応しており、ビット高低順序も同じである.
実際にUNICodeをUTF-8符号化に変換する場合は、まず上位0を除去し、残りの符号化ビット数に基づいて必要最小のUTF-8符号化ビット数を決定する.
したがって、基本的なASCII文字セットの文字(UNICode互換ASCII)は、1バイトのUTF-8符号化(7バイナリビット)で表すことができる.
文字列がUTF-8符号化されたコードであるか否かを判断する
今ネット上でいくつかの判断のアルゴリズムがあって、しかし最后にすべて判断が正确ではありませんと言って、その原因を究明してコードが书き间违って、ははは、ウェブサイトの中のプログラムを参考にして、みんなは见ることができます.
以下は私が書いた正しいコードです.
#include "stdio.h"
bool isNonAsciiUTF8(const char* str, int &len) {
if (*str == 0) {
return false;
}
unsigned char chr = *str;
if(chr>=0x80)
{
if(chr>=0xFC&&chr<=0xFD)
len=6;
else if(chr>=0xF8)
len=5;
else if(chr>=0xF0)
len=4;
else if(chr>=0xE0)
len=3;
else if(chr>=0xC0)
len=2;
else
{
return false;
}
}
for(int i=1; i<len; i++) {
chr = *(str+i);
if (chr == 0) return false;
if( (chr & 0xC0) != 0x80) {
return false;
}
}
return true;
}
bool isTextUTF8(const char* str)
{
unsigned char chr;
while(*str) {
chr = *str;
if((chr & 0x80) == 0) {
++str;
continue;
} else {
int len;
if (!isNonAsciiUTF8(str, len)) {
return false;
} else {
str += len;
continue;
}
}
}
return true;
}
void test(char *p) {
static int i = 0;
i++;
if (isTextUTF8(p)) {
printf("%d is UTF8 text
", i);
} else {
printf("%d isn't UTF8 text
", i);
}
}
int main()
{
char bytes[7];
bytes[0] = (unsigned char)0x31;
bytes[1] = 0;
test(bytes);
// 11000000 10110001
bytes[0] = (unsigned char)0xC0;
bytes[1] = (unsigned char)0xB1;
bytes[2] = 0;
test(bytes);
// 11100000 10000000 10110001
bytes[0] = (unsigned char)0xE0;
bytes[1] = (unsigned char)0x80;
bytes[2] = (unsigned char)0xB1;
bytes[3] = 0;
test(bytes);
// 11110000 10000000 10000000 10110001
bytes[0] = (unsigned char)0xF0;
bytes[1] = (unsigned char)0x80;
bytes[2] = (unsigned char)0x80;
bytes[3] = (unsigned char)0xB1;
bytes[4] = 0;
test(bytes);
// 11111000 10000000 10000000 10000000 10110001
bytes[0] = (unsigned char)0xF8;
bytes[1] = (unsigned char)0x80;
bytes[2] = (unsigned char)0x80;
bytes[3] = (unsigned char)0x80;
bytes[4] = (unsigned char)0xB1;
bytes[5] = 0;
test(bytes);
// 11111100 10000000 10000000 10000000 10000000 10110001
bytes[0] = (unsigned char)0xFC;
bytes[1] = (unsigned char)0x80;
bytes[2] = (unsigned char)0x80;
bytes[3] = (unsigned char)0x80;
bytes[4] = (unsigned char)0x80;
bytes[5] = (unsigned char)0xB1;
bytes[6] = 0;
test(bytes);
return 0;
}
参考文献:
http://blog.csdn.net/sandyen/article/details/1108168
http://archive.cnblogs.com/a/1914592/
http://www.zxbc.cn/html/20081125/68270.html