天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 5|回复: 0

C/C++ Unicode与Ansi编码互转

[复制链接]
  • TA的每日心情
    开心
    昨天 15:23
  • 签到天数: 69 天

    [LV.6]常住居民II

    410

    主题

    167

    回帖

    2704

    积分

    管理员

    积分
    2704
    发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
    [code]#include <windows.h>
    #include<iostream>
    using namespace std;

    void Ansi2Unicode(wchar_t* _Destination, const char*_Source)
    {
            //预转换,得到所需空间的大小
            int wcsLen = MultiByteToWideChar(CP_ACP, NULL, _Source, strlen(_Source), NULL, 0);

            //分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
            wchar_t* wszString = new wchar_t[wcsLen + 1];
            //转换
            MultiByteToWideChar(CP_ACP, NULL, _Source, strlen(_Source), wszString, wcsLen);
            //最后加上'\0'
            wszString[wcsLen] = '\0';

            wcscpy(_Destination, wszString);

            delete[] wszString;
    }

    void Unicode2Ansi(char* _Destination, const wchar_t*_Source)
    {
            //预转换,得到所需空间的大小,这次用的函数和上面名字相反
            int ansiLen = WideCharToMultiByte(CP_ACP, NULL, _Source, wcslen(_Source), NULL, 0, NULL, NULL);
            //同上,分配空间要给'\0'留个空间
            char* szAnsi = new char[ansiLen + 1];
            //转换
            //unicode版对应的strlen是wcslen
            WideCharToMultiByte(CP_ACP, NULL, _Source, wcslen(_Source), szAnsi, ansiLen, NULL, NULL);
            //最后加上'\0'
            szAnsi[ansiLen] = '\0';

            strcpy(_Destination, szAnsi);

            delete[] szAnsi;
    }

    void UTF82Unicode(wchar_t* _Destination, char* _Source)
    {
            //UTF8 to Unicode
            char* szU8 = _Source;
            //预转换,得到所需空间的大小
            int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);
            //分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
            wchar_t* wszString = new wchar_t[wcsLen + 1];
            //转换
            ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszString, wcsLen);
            //最后加上'\0'
            wszString[wcsLen] = '\0';
           
            wcscpy(_Destination, wszString);

            delete[] wszString;
            wszString = NULL;
    }

    void Unicode2UTF8(char* _Destination, wchar_t*  _Source)
    {
            // unicode to UTF8
            wchar_t* wszString =_Source;
            //预转换,得到所需空间的大小,这次用的函数和上面名字相反
            int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL);
            //同上,分配空间要给'\0'留个空间
            //UTF8虽然是Unicode的压缩形式,但也是多字节字符串,所以可以以char的形式保存
            char* szU8 = new char[u8Len + 1];
            //转换
            //unicode版对应的strlen是wcslen
            ::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), szU8, u8Len, NULL, NULL);
            //最后加上'\0'
            szU8[u8Len] = '\0';

            strcpy(_Destination, szU8);

            delete[] szU8;
            szU8 = NULL;
    }

    int main()
    {
            wchar_t wstr[1024];
            char str[1024];

            wcscpy(wstr, L"U转A!");
            UnicodeToAnsi(str, wstr);
            MessageBoxA(NULL, str, "", MB_ICONASTERISK | MB_OK);

            strcpy(str, "A转U");
            AnsiToUnicode(wstr, str);
            MessageBox(NULL, wstr, L"", MB_ICONASTERISK | MB_OK);


            return 0;
    }[/code]

     

     

     

     

    C/C++ Unicode与Ansi编码互转
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|

    GMT+8, 2024-7-1 05:48 , Processed in 0.057828 second(s), 22 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表