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

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门


在项目开发过程中,字符串使用必不可少,所以在 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 相互转换

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C/C++ char 和 wchar_t 相互转换C/C++ char 和 wchar_t 相互转换
//@Time:2021/08/08 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/

#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. C语言 数组下标越界和内存溢出区别
  2. C语言 使用指针遍历数组
  3. C语言 指针和数组区别
  4. C语言 指针数组和数组指针区别
  5. C语言 野指针
  6. C语言 函数值传递和址传递
  7. C语言 函数不定长参数
  8. C语言 函数指针
  9. C语言 指针函数
  10. C语言 回调函数 callback
  11. C语言 #pragma once
  12. C语言 #include <> 与 #include “” 区别
  13. C语言 const 修饰函数参数
  14. C语言 const 和 define 区别
  15. C语言 #运算符
  16. C语言 ##运算符
  17. C语言 __VA_ARGS__
  18. C语言 ##__VA_ARGS__
  19. C语言 函数不定长参数 ##__VA_ARGS__经典案例
  20. C语言 va_start / va_end / va_arg 自定义 printf 函数
  21. C语言 main 函数
  22. C语言 main 函数参数 main(int argc, char *argv[])
  23. C语言 局部变量
  24. C语言 全局变量
  25. C语言 全局变量和局部变量区别
  26. C语言 static
  27. C语言 extern
  28. C/C++ Unicode 和多字节区别
  29. C/C++ wprintf 输出中文乱码
  30. C/C++ char 和 wchar_t 相互转换


未经允许不得转载:猿说编程 » C/C++ char 和 wchar_t 相互转换
喜欢(1) 打赏

评论抢沙发

评论前必须登录!

不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!!

开始学习

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏