テキストファイルの内容をどのように判断しますか?ANSI(GBK)

11501 ワード

回転:http://blog.csdn.net/jiangqin115/article/details/42684017
UTF-8符号化された文書ドキュメントには、BOM(Byte Order Mark、バイト順フラグ)というものがあります.即ち、0 xEF、0 xBB、0 xBFというものがあります.Windows下のtxtテキストエディタは、UTF-8形式の文書ドキュメントを保存すると自動的にBOMをファイルヘッダに追加します.これらの文書を判断するときは、ドキュメントの最初の3バイトから判断することができます.しかし、BOMは必要ではなく、オススメでもありません.UTF-8ドキュメントにBOMがあると希望しないプログラムに互換性があります.例えば、JavaコンパイラはBOMがあるUTF-8ソースファイルをコンパイルする時にエラーが発生します.また、BOMはUTF-8の望ましい特性を削除しました.つまり、テキストがすべてASCII文字である場合、UTF-8はASCIIと一致しています.つまり、UTF-8はASCIIと下向きに対応しています.具体的な判断においては、文書にBOMがないとBOMによって判断できないし、IsText Uniode APIもUTF-8の符号化されたUniode文字列を判断することができない.プログラミングの判断はUTF-8文字コードの法則に基づいて判断します.UTF-8は、Unicode文字を表す多バイト符号化の文字セットであり、1バイト以上とすることができます.表示には規則があります.1バイト:0 xxxxx 2バイト:110 xxxxxxxxxx 3バイト:1110 xxxxx 10 xxxxxxxx 4バイト:11110 XXX 10 xxxxxxxxxxxxxx 10 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 4バイト:このように文字列を上の特徴に基づいて繰り返して一つの文字列がUTF-8符号化されたかどうかを判断UTF-8文字列の各バイトの取得値には一定の範囲があり、すべての値が有効なUTF-8文字ではないことを指摘したいが、一般的なアプリケーションの場合、このような判断は十分に長い文字列および比較的正確であり、実現も簡単である.具体的なバイトの取得範囲は「Unicode Explined」の本の6.4.3を参照してください.また、BOM自体も3バイトのUTF-8文字符号化規則に適合しているので、本方法はBOM付きUTF-8文字列にも有効である.
 
1.テキストがUTF符号化されているかどうかを判断する
以下の手順では最大3バイトのUTF-8文字を判断していますが、実際にはほとんど使えるUTF-8の文字が一番長いのは3バイトです.
 1 bool IsUTF8(const void* pBuffer, long size)  
 2 {  
 3     bool IsUTF8 = true;  
 4     unsigned char* start = (unsigned char*)pBuffer;  
 5     unsigned char* end = (unsigned char*)pBuffer + size;  
 6     while (start < end)  
 7     {  
 8         if (*start < 0x80) // (10000000):    0x80  ASCII      
 9         {  
10             start++;  
11         }  
12         else if (*start < (0xC0)) // (11000000):    0x80 0xC0      UTF-8      
13         {  
14             IsUTF8 = false;  
15             break;  
16         }  
17         else if (*start < (0xE0)) // (11100000):      2  UTF-8      
18         {  
19             if (start >= end - 1)  
20             {  
21                 break;  
22             }  
23   
24             if ((start[1] & (0xC0)) != 0x80)  
25             {  
26                 IsUTF8 = false;  
27                 break;  
28             }  
29   
30             start += 2;  
31         }  
32         else if (*start < (0xF0)) // (11110000):      3  UTF-8      
33         {  
34             if (start >= end - 2)  
35             {  
36                 break;  
37             }  
38   
39             if ((start[1] & (0xC0)) != 0x80 || (start[2] & (0xC0)) != 0x80)  
40             {  
41                 IsUTF8 = false;  
42                 break;  
43             }  
44   
45             start += 3;  
46         }  
47         else  
48         {  
49             IsUTF8 = false;  
50             break;  
51         }  
52     }  
53   
54     return IsUTF8;  
55 }  
2.ファイルがUTF-8符号化されているかどうかを判断する:
 1 bool CConvertCharset::IsUTF8File(const char* pFileName)  
 2 {  
 3     FILE *f = NULL;  
 4     fopen_s(&f, pFileName, "rb");  
 5     if (NULL == f)  
 6     {  
 7         return false;  
 8     }  
 9   
10     fseek(f, 0, SEEK_END);  
11     long lSize = ftell(f);  
12     fseek(f, 0, SEEK_SET);  // rewind(f);  
13   
14     char *pBuff = new char[lSize + 1];  
15     memset(pBuff, 0, lSize + 1);  
16     fread(pBuff, lSize, 1, f);  
17     fclose(f);  
18   
19     bool bIsUTF8 = IsUTF8Text(pBuff, lSize);  
20     delete []pBuff;  
21     pBuff = NULL;  
22   
23     return bIsUTF8;  
24 }