txt文書ドキュメントの符号化タイプ(c++,c#)を取得する


ファイルの文字セットはWindowsの下に2種類あります.1つはANSI、1つはUnicodeです.
Unicodeの場合、Windowsはその3つの符号化方式をサポートし、1つは小尾符号化(Unicode)、1つは大尾符号化(BigEndianUnicode)、1つはUTF-8符号化である.
ファイルのヘッダから、ファイルがどの符号化に属しているかを区別することができます.ヘッダの最初の2バイトがFFFEである場合、Unicodeの小尾符号化である.ヘッダの2バイトがFE FFの場合、Unicodeの最後尾符号化である.ヘッダの2バイトがEF BBの場合、UnicodeのUTF-8符号化である.これらでない場合、ANSI符号化になります.
プロジェクトではちょうど判断符号化の関数を用いて,次のように補助関数を書いた.
/***********************************************************************************************************************************************************************************************************************************************wang関数タイプwang関数タイプ:補助関数関数名:lcl_GetTextEncode関数機能:指定されたパスのtxtドキュメントの符号化フォーマットの戻り値を取得する:LONG 1-UTF-8 2-Unicode 3-Unicode big endian 4-ASCII-1-error******************************/LONG CNsoControl::lcl_GetTextEncode(CString strTxtPath){LONG nType=-1;//error//判断するファイルFILE*pFile=NULLを開く;errno_t dError=_wfopen_s(&pFile,strTxtPath,L"r");if(0!=dError){fclose(pFile);returnnType;}//ここではunsigned charを使うことに注意し、そうでないと読み取ったデータがオーバーフローしてunsigned char*chFileFlag=new unsigned charを正しく判断できない[3].    fread(chFileFlag,   1,   3,   pFile);     if(chFileFlag[0]   ==   0xEF   &&   chFileFlag[1]   ==   0xBB   &&   chFileFlag[2]   ==   0xBF)         nType = 1;//UTF-8     else if (chFileFlag[0]   ==   0xFF   &&   chFileFlag[1]   ==   0xFE)         nType = 2;//Unicode     else if (chFileFlag[0]   ==   0xFE   &&   chFileFlag[1]   ==   0xFF)         nType = 3;//Unicode big endian text     else           nType = 4;//ASCII     fclose(pFile);     delete chFileFlag;     return nType;    }
c#コードは次のとおりです.public System.Text.Encoding  GetFileEncodeType( string filename) {      System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read);      System.IO.BinaryReader br = new System.IO.BinaryReader(fs);      Byte[] buffer = br.ReadBytes(2);      if (buffer[0]>=0xEF)      {          if (buffer[0]==0xEF && buffer[1]==0xBB)          {               return System.Text.Encoding.UTF8;          }          else if (buffer[0]==0xFE && buffer[1]==0xFF)          {               return System.Text.Encoding.BigEndianUnicode;          }          else if (buffer[0]==0xFF && buffer[1]==0xFE)          {               return System.Text.Encoding.Unicode;          }          else          {               return System.Text.Encoding.Default;          }      }      else      {               return System.Text.Encoding.Default;      } }
プログラム中のシステムText.Encoding.Defaultとは、オペレーティングシステムの現在のANSIコードページの符号化です.