C/C++ char和wchar_t相互转换

最后更新于:2020-06-16 21:05:29

在项目开发过程中,字符串使用必不可少,所以在unicode编码和多字节编码中,类型的相互转换必不可少,如何完成charwchar_t之间的相互转换呢?


一.如何区分宽字节字符串和多字节字符串


宽字节字符串前面通常使用L修饰,变量类型使用wchar_t或者WCHAR,例如:

wchar_t *a1 = L"123456";
wchar_t *a2 = L"C/C++教程 - 猿说编程";


多字节字符串就是普通字符串,前面没有任何修饰符,变量类型使用char或者CHAR,例如:

char *a1 = "123456";
char *a2 = "C/C++教程 - 猿说编程";


二.printf和wprintf


注意printf/wprintf函数区别,在 unicode和多字节区别 文章中也有介绍 :Win32 API中大部分参数有字符串的函数都有两个版本,以A结尾,代表多字节版本,以W结尾,代表Unicode版本,两者互不兼容

输出多字节字符串,使用printf ;输出宽字节字符串,使用wprintf ;

三.wprintf输出中文乱码


wprintf输出宽字节字符串的时候,如果字符串中含有中文需要通过 setlocale 函数设置本地化语言为中文,具体细节在 wprintf输出中文乱码 中有介绍;

四.char和wchar_t相互转换

/************************************************************************/
/*@文件名      : char2wchar.cpp                                                       
/*@日  期      : 2020/5/29 19:37
/*@作  者      : 猿说编程 
/*@公众号      : 猿说编程
/*@博客        : www.shuopython.com
/*@描述        : char2wchar/wchar2char char和wchar_t相互转换
/************************************************************************/
#include "stdafx.h"
#include <stdio.h>
#include "windows.h"
#include <Locale.h>

// char 转为 wchar_t
wchar_t * char2wchar(const char* cchar)
{
    wchar_t *m_wchar;
    int len = MultiByteToWideChar(CP_ACP, 0, cchar, strlen(cchar), NULL, 0);
    m_wchar = new wchar_t[len + 1];
    MultiByteToWideChar(CP_ACP, 0, cchar, strlen(cchar), m_wchar, len);
    m_wchar[len] = '\0';
    return m_wchar;
}

// wchar_t 转为 char 
char * wchar2char(const wchar_t* wchar)
{
    char * m_char;
    int len = WideCharToMultiByte(CP_ACP, 0, wchar, wcslen(wchar), NULL, 0, NULL, NULL);
    m_char = new char[len + 1];
    WideCharToMultiByte(CP_ACP, 0, wchar, wcslen(wchar), m_char, len, NULL, NULL);
    m_char[len] = '\0';
    return m_char;
}
int main()
{
    setlocale(LC_ALL, "chs");        // 本地化语言设置为中文,否则中文乱码

    char* szSrc1 = "C/C++教程-猿说编程";
    wchar_t* szSrc2 = L"C/C++教程-猿说编程";

    wchar_t* szDst1 = char2wchar(szSrc1);
    char* szDst2 = wchar2char(szSrc2);

    //输出多字节字符串用 printf
    printf("宽字节字符串 szSrc2 转为多字节字符串结果:%s \n", szDst2);
    //输出宽字节字符串用 wprintf
    wprintf(L"多字节字符串 szSrc1 转为宽字节字符串结果:%s\n", szDst1);

    //释放内存
    free(szDst1);
    free(szDst2);

    system("pause");
    return 0;
}
输出:

宽字节字符串 szSrc2 转为多字节字符串结果:C/C++教程-猿说编程
多字节字符串 szSrc1 转为宽字节字符串结果:C/C++教程-猿说编程
请按任意键继续. . .


猜你喜欢

1. 三目运算符

2. 逗号表达式

3. getchar函数

4. putchar函数

5. unicode和多字节区别


转载请注明: 猿说编程 » C/C++教程 » char和wchar_t相互转换



技术交流、商务合作请直接联系博主
扫码或搜索:猿说编程

python/C++教程

猿说编程
微信公众号 扫一扫关注