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

使用Unicode字符集出现乱码问题MFC 中 Unicode 与 ASCII 码转换 Unicode 码与 ASCII 码 nbsp nbsp nbsp nbsp Unicode 码 Unicode 码也是一种国际标准编码 采用二个字节编码 与 ASCII 码不兼容 它前 128 个字符就是 ASCII 码 之后是扩展码 nbsp nbsp nbsp nbsp ASCII 码 AmericanStan 美国信息交换标准代码 标准 ASCII

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;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226533.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:41
下一篇 2026年3月16日 下午10:41


相关推荐

  • Java Map集合的详解「建议收藏」

    Java Map集合的详解「建议收藏」一,Map先说一下Map吧~如果程序中存储了几百万个学生,而且经常需要使用学号来搜索某个学生,那么这个需求有效的数据结构就是Map。Map是一种依照键(key)存储元素的容器,键(key)很像下标,在List中下标是整数。在Map中键(key)可以使任意类型的对象。Map中不能有重复的键(Key),每个键(key)都有一个对应的值(value)。一个键(key)和它对应的值构成ma

    2022年5月30日
    40
  • linux(11)配置环境变量「建议收藏」

    linux(11)配置环境变量「建议收藏」前言在自定义安装软件的时候,经常需要配置环境变量,下面进行详细解析 环境变量配置文件|用户|配置文件||:|:||系统环境|/ect/profil

    2022年7月28日
    13
  • django-redis_文件缓存和redis缓存的区别

    django-redis_文件缓存和redis缓存的区别前言动态网站的基本权衡是,它们是动态的。每次用户请求页面时,Web服务器都会进行各种计算-从数据库查询到模板呈现再到业务逻辑-以创建站点访问者看到的页面。从处理开销的角度来看,这比标准的文件

    2022年7月29日
    16
  • Linux makefile 教程 很具体,且易懂

    Linux makefile 教程 很具体,且易懂

    2021年12月1日
    41
  • eclipse创建一个java项目目录_Eclipse创建JAVA项目

    eclipse创建一个java项目目录_Eclipse创建JAVA项目项目:project包:package类:class为了便于硬盘上的文件进行管理,通常都会将文件分目录进行存放。同理,在程序开发中,也需要将编写的类在项目中分目录存放,以便于文件管理。为此,Jaca引入了包(package)机制,(貌似跟Python的包差不多),程序可以通过声明包的方式对Java类定义目录。Java中的包是专门用来存放类的,通常功能相同的类存放在相同的包中。在声明包时,使用Pac…

    2022年7月19日
    18
  • Idea激活码教程2025.1.1.1永久有效激活码绝对有效2025.1.1.1

    Idea激活码教程2025.1.1.1永久有效激活码绝对有效2025.1.1.1Idea 激活码教程永久有效 2025 1 1 1 激活码教程 Windows 版永久激活 持续更新 Idea 激活码 2025 1 1 1 成功激活

    2025年5月21日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号