UNICODE及ANSI切分转化问题

来源:互联网 发布:淘宝美工和运营 编辑:程序博客网 时间:2024/05/16 18:42

 char s[256];
 char sc[25];
 strcpy(s, "我,你,他,");
 int nLen = strlen(s);
 WCHAR w[256];
 WCHAR wc[10];
 nLen = MultiByteToWideChar(CP_ACP, 0, s, -1, NULL, 0);
 nLen = MultiByteToWideChar(CP_ACP, 0, s, -1, w, nLen);
 MessageBoxW(NULL, w, w, MB_OK);
 memcpy(wc, w, sizeof(WCHAR)*2);
 wc[2] = 0;
 nLen = WideCharToMultiByte (CP_ACP, 0, wc, -1, NULL,0, NULL, NULL);
 WideCharToMultiByte (CP_ACP, 0, wc, -1, sc, nLen, NULL, NULL);
 MessageBox(sc);

GB及BIG5转化

简繁体 API 内码 BIG5 GB2312 MultiByteToWideChar WideCharToMultiByte
目的: 幫助受 內碼轉換 困擾的朋友
1. 输入Big5字符,返回Gb简体字符
    //---------------------------------------------------------------------------
    //函数输入Big5字符,返回Gb简体字符
    //---------------------------------------------------------------------------
    AnsiString __fastcall Big2Gb(AnsiString sBig)
    {
     char* pszBig5=NULL; //Big5编码的字符
     wchar_t* wszUnicode=NULL; //Unicode编码的字符
     char* pszGbt=NULL; //Gb编码的繁体字符
     char* pszGbs=NULL; //Gb编码的简体字符
     AnsiString sGb; //返回的字符串
     int iLen=0; //需要转换的字符数
    
     pszBig5=sBig.c_str(); //读入需要转换的字符参数
    
     //计算转换的字符数
     iLen=MultiByteToWideChar (950, 0, pszBig5, -1, NULL,0);
     //给wszUnicode分配内存
     wszUnicode=new wchar_t[iLen+1];
     //转换Big5码到Unicode码,使用了API函数MultiByteToWideChar
     MultiByteToWideChar (950, 0, pszBig5, -1, wszUnicode,iLen);
    
     //计算转换的字符数
     iLen=WideCharToMultiByte (936, 0, (PWSTR) wszUnicode, -1, NULL,0, NULL, NULL);
     //给pszGbt分配内存
     pszGbt=new char[iLen+1];
     //给pszGbs分配内存
     pszGbs=new char[iLen+1];
     //转换Unicode码到Gb码繁体,使用API函数WideCharToMultiByte
     WideCharToMultiByte (936, 0, (PWSTR) wszUnicode, -1, pszGbt,iLen, NULL, NULL);
    
     //转换Gb码繁体到Gb码简体,使用API函数LCMapString
     LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE, pszGbt, -1, pszGbs, iLen);
    
     //返回Gb码简体字符
     sGb=pszGbs;
    
     //释放内存
     delete [] wszUnicode;
     delete [] pszGbt;
     delete [] pszGbs;
      
     return sGb;
    }
2. 输入Gb字符,返回Big5字符
    //---------------------------------------------------------------------------
    //函数输入Gb字符,返回Big5字符
    //---------------------------------------------------------------------------
    AnsiString __fastcall Gb2Big(AnsiString sGb)
    {
     char* pszGbt=NULL; //Gb编码的繁体字符
     char* pszGbs=NULL; //Gb编码的简体字符
     wchar_t* wszUnicode=NULL; //Unicode编码的字符
     char* pszBig5=NULL; //Big5编码的字符
     AnsiString sBig5; //返回的字符串
     int iLen=0; //需要转换的字符数
    
     pszGbs=sGb.c_str(); //读入需要转换的字符参数
    
     //计算转换的字符数
     iLen=MultiByteToWideChar (936, 0, pszGbs, -1, NULL,0);
    
     //给pszGbt分配内存
     pszGbt=new char[iLen*2+1];
     //转换Gb码简体到Gb码繁体,使用API函数LCMapString
     LCMapString(0x0804,LCMAP_TRADITIONAL_CHINESE, pszGbs, -1, pszGbt, iLen*2);
    
     //给wszUnicode分配内存
     wszUnicode=new wchar_t[iLen+1];
     //转换Gb码到Unicode码,使用了API函数MultiByteToWideChar
     MultiByteToWideChar (936, 0, pszGbt, -1, wszUnicode,iLen);
    
     //计算转换的字符数
     iLen=WideCharToMultiByte (950, 0, (PWSTR) wszUnicode, -1, NULL,0, NULL, NULL);
     //给pszBig5分配内存
     pszBig5=new char[iLen+1];
     //转换Unicode码到Big5码,使用API函数WideCharToMultiByte
     WideCharToMultiByte (950, 0, (PWSTR) wszUnicode, -1, pszBig5,iLen, NULL, NULL);
    
     //返回Big5码字符
     sBig5=pszBig5;
    
     //释放内存
     delete [] wszUnicode;
     delete [] pszGbt;
     delete [] pszBig5;
    
     return sBig5;
    }


代码:

#include &windows.h&
#include &iostream&
#include &tchar.h&

PSTR __fastcall Gb2Big(PSTR sGb);
PSTR __fastcall Big2Gb(PSTR pszBig5);

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
        PSTR pszTemp = Gb2Big("aaa");

        cout && pszTemp && endl;
        cout && Big2Gb(pszTemp) && endl;

        return 0;
}

原创粉丝点击