零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门
在项目开发过程中,字符串使用必不可少,所以在 unicode
编码和多字节编码中,类型的相互转换必不可少,如何完成 char
和 wchar_t
之间的相互转换呢?
一.如何区分宽字节字符串和多字节字符串
宽字节字符串前面通常使用 L
修饰,变量类型使用 wchar_t
或者 WCHAR
,例如:
wchar_t *a1 = L"123456"<em>;</em>wchar_t *a2 = L"C/C++教程 - 猿说编程"<em>;</em>wchar_t *a1 = L"123456"<em>;</em> wchar_t *a2 = L"C/C++教程 - 猿说编程"<em>;</em>wchar_t *a1 = L"123456"; wchar_t *a2 = L"C/C++教程 - 猿说编程";
多字节字符串就是普通字符串,前面没有任何修饰符,变量类型使用 char
或者 CHAR
,例如:
char *a1 = "123456"<em>;</em>char *a2 = "C/C++教程 - 猿说编程"<em>;</em>char *a1 = "123456"<em>;</em> char *a2 = "C/C++教程 - 猿说编程"<em>;</em>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_twchar_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 转为 charchar * 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);//输出多字节字符串用 printfprintf("宽字节字符串 szSrc2 转为多字节字符串结果:%s \n", szDst2);//输出宽字节字符串用 wprintfwprintf(L"多字节字符串 szSrc1 转为宽字节字符串结果:%s\n", szDst1);//释放内存free(szDst1);free(szDst2);system("pause");return 0;}/*输出:宽字节字符串 szSrc2 转为多字节字符串结果:C/C++教程-猿说编程多字节字符串 szSrc1 转为宽字节字符串结果:C/C++教程-猿说编程请按任意键继续. . .*//******************************************************************************************/ //@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++教程-猿说编程 请按任意键继续. . . *//******************************************************************************************/ //@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++教程-猿说编程 请按任意键继续. . . */
五.猜你喜欢
- C语言 数组下标越界和内存溢出区别
- C语言 使用指针遍历数组
- C语言 指针和数组区别
- C语言 指针数组和数组指针区别
- C语言 野指针
- C语言 函数值传递和址传递
- C语言 函数不定长参数
- C语言 函数指针
- C语言 指针函数
- C语言 回调函数 callback
- C语言 #pragma once
- C语言 #include <> 与 #include “” 区别
- C语言 const 修饰函数参数
- C语言 const 和 define 区别
- C语言 #运算符
- C语言 ##运算符
- C语言 __VA_ARGS__
- C语言 ##__VA_ARGS__
- C语言 函数不定长参数 ##__VA_ARGS__经典案例
- C语言 va_start / va_end / va_arg 自定义 printf 函数
- C语言 main 函数
- C语言 main 函数参数 main(int argc, char *argv[])
- C语言 局部变量
- C语言 全局变量
- C语言 全局变量和局部变量区别
- C语言 static
- C语言 extern
- C/C++ Unicode 和多字节区别
- C/C++ wprintf 输出中文乱码
- C/C++ char 和 wchar_t 相互转换
ChatGPT 3.5 国内中文镜像站免费使用啦
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容