使用Unicode字符集出现乱码问题

MFC中Unicode与ASCII码转换

Unicode码与ASCII码

     Unicode码:Unicode码也是一种国际标准编码,采用二个字节编码,与ASCII码不兼容。它前128个字符就是ASCII码,之后是扩展码。

     ASCII码:American Standard Code for Information Interchange,美国信息交换标准代码。标准ASCII 码也叫基础ASCII码,使用7 二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 9、标点符号, 以及在美式英语中使用的特殊控制字符

 

 

 

MFC中工程中的设置字符集

Mfc工程中字符集的设置

使用Unicode字符集出现乱码问题

在mfc工程属性->配置属性中->常规中->项目默认值->字符集中,有使用Unicode字符集的设置。

该字符集设置为Unicode字符集后,常用的CString的初始化,格式化接口,需要用到_T宏。此外,在char型数组转化为CString中,常常有乱码出现。下面总结一下,出现乱码后的解决方法。

当字符集设置成”使用多字节字符集”时,

将CString转化成char型数据指针:

CString file;

char* pFile = (LPSTR)(LPCSTR)file;

        将char型数据转化为CString,不需要添加_T宏:

        CString info;

char version[20];

        info.AppendFormat("ldmp Sn: [%s] ..", version);

 

   当字符集设置成”使用Unicode字符集”时,

CString与char型数据相互转化如下:

       void CStringToChar(CString str,char *dst)

{

#ifdef _UNICODE

    wchar_t *wChar = str.GetBuffer(str.GetLength());

    str.ReleaseBuffer();

 

    // 将得到的wchar* 类型转为 char*类型

    size_t len = wcslen(wChar) + 1;

    size_t converted = 0;

    char *cChar;

    cChar = (char*)malloc(len * sizeof(char));

    wcstombs_s(&converted, cChar, len, wChar, _TRUNCATE);

 

    strcpy(dst,cChar);

    free(cChar);

#else

    CString cstr(str);

    char *p = (LPSTR)(LPCSTR)str1;

 

    // 第二种

    使用 GetBuffer方法返回 char * 类型

        CString str1 = "123";

    char *t1 = str1.GetBuffer(str1.GetLength());

    str1.ReleaseBuffer();

#endif

}

将char转化为CString方法:

  1. 直接使用格式化字符串。

CString info;

char version[20];

info.AppendFormat(_T("ldmp Sn: [%s] .."), version);

 

   

 

   2.使用以下方法也可以转化

CString charToCString(char* str)

{

    //将char 转换为 CString字符

#ifdef _UNICODE

    DWORD dwNum = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);

    wchar_t *pwText;

    pwText = new wchar_t[dwNum];

    if (!pwText)

    {

        return _T("");

    }

 

    MultiByteToWideChar(CP_ACP, 0, str, -1, pwText, dwNum);

 

    CString cstr = pwText;

    delete[](char *)pwText;

#else

    CString cstr(str);

 

#endif

    return cstr;

}

 

 

 

 

 

 

 

 

 

附:

GB2312,BIG5,Unicode编码转换方法

//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;

}