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#コードは次のとおりです.
プログラム中のシステムText.Encoding.Defaultとは、オペレーティングシステムの現在のANSIコードページの符号化です.
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コードページの符号化です.