VCでGB 2312、BIG 5、Unicode符号化変換を実現する方法

4441 ワード

本稿では,VCコンパイル環境において文字列とファイル符号化方式の変換を実現する方法を主に例として論じ,linuxではStrconvを用いて実現してください.具体的な方法は以下の通りです.
一、ファイルコードフォーマット変換

//GB2312   Unicode:
if((file_handle = fopen(filenam,"rb")) != NULL)
{
    // GB2312 buffer
    numread = fread(str_buf_pool,sizeof(char),POOL_BUFF_SIZE,file_handle);
    fclose(file_handle);
   //GB2312 buffer UNICODE
   nLen  =MultiByteToWideChar(CP_ACP,0,str_buf_pool,-1,NULL,0); 
   MultiByteToWideChar(CP_ACP,0,str_buf_pool,-1,(LPWSTR)str_unicode_buf_pool,nLen);
   // UNICODE Little Endian "0xFF 0xFE" 
   // :UNICODE Big Endian "0xFF 0xFE" 
   //Little Endian Big Endian 
   unicode_little_file_header[0]=0xFF;
   unicode_little_file_header[1]=0xFE;
   // 
   if((file_handle=fopen(filenewname,"wb+")) != NULL)
   {
   fwrite(unicode_little_file_header,sizeof(char),2,file_handle);
   numwrite = fwrite(str_unicode_buf_pool,sizeof(LPWSTR),nLen,file_handle);
   fclose(file_handle);
   }
}


二、文字列符号化フォーマット変換

//GB2312   Unicode:
wchar_t* GB2312ToUnicode(const char* szGBString)
{
    UINT nCodePage = 936; //GB2312
    int nLength=MultiByteToWideChar(nCodePage,0,szGBString,-1,NULL,0);
    wchar_t* pBuffer = new wchar_t[nLength+1];
    MultiByteToWideChar(nCodePage,0,szGBString,-1,pBuffer,nLength);
    pBuffer[nLength]=0;
    return pBuffer;
}
//BIG5   Unicode:
wchar_t* BIG5ToUnicode(const char* szBIG5String)
{
    UINT nCodePage = 950; //BIG5
    int nLength=MultiByteToWideChar(nCodePage,0,szBIG5String,-1,NULL,0);
    wchar_t* pBuffer = new wchar_t[nLength+1];
    MultiByteToWideChar(nCodePage,0,szBIG5String,-1,pBuffer,nLength);
    pBuffer[nLength]=0;
    return pBuffer;
}
//Unicode   GB2312:
char* UnicodeToGB2312(const wchar_t* szUnicodeString)
{
    UINT nCodePage = 936; //GB2312
    int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);
    char* pBuffer=new char[nLength+1];
    WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);
    pBuffer[nLength]=0;
    return pBuffer;
}
//Unicode   BIG5:
char* UnicodeToBIG5(const wchar_t* szUnicodeString)
{
    UINT nCodePage = 950; //BIG5
    int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);
    char* pBuffer=new char[nLength+1];
    WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);
    pBuffer[nLength]=0;
    return pBuffer;
}
// BIG5     GB2312
char* BIG5ToGB2312(const char* szBIG5String)
{
    LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);
    wchar_t* szUnicodeBuff = BIG5ToUnicode(szBIG5String);
    char* szGB2312Buff = UnicodeToGB2312(szUnicodeBuff);
    int nLength = LCMapString(lcid,LCMAP_SIMPLIFIED_CHINESE, szGB2312Buff,-1,NULL,0);
    char* pBuffer = new char[nLength + 1];
    LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE,szGB2312Buff,-1,pBuffer,nLength);
    pBuffer[nLength] = 0;
    
    delete[] szUnicodeBuff;
    delete[] szGB2312Buff;
    return pBuffer;
}
//  GB2312    BIG5
char* GB2312ToBIG5(const char* szGBString)
{
    LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);
    int nLength = LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,NULL,0);
    char* pBuffer=new char[nLength+1];
    LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,pBuffer,nLength);
    pBuffer[nLength]=0;
    wchar_t* pUnicodeBuff = GB2312ToUnicode(pBuffer);
    char* pBIG5Buff = UnicodeToBIG5(pUnicodeBuff);
    delete[] pBuffer;
    delete[] pUnicodeBuff;
    return pBIG5Buff;
}


三、API関数:MultiByteToWideCharパラメータ説明
1番目のパラメータはコードページ、GetLocaleInfo関数で現在のシステムのコードページを取得し、936:簡体字中国語、950:繁体字中国語2番目のパラメータはオプションで、一般的に0で3番目のパラメータはANSI文字列のアドレスで、この文字列は1番目のパラメータで指定された言語のANSI文字列(AnsiString)4番目のパラメータはANSI文字列の長さで、-1であれば、0を終端とする文字列の5番目のパラメータが変換生成されたunicode文字列(WidesString)のアドレスであることを示し、NULLであれば、生成された文字列の長さを計算する6番目のパラメータが変換生成されたunicode文字列キャッシュの容量である、つまりUNICode文字が何個あるかを表す.