零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门
在项目开发过程中,字符串使用必不可少,所以在 unicode
编码和多字节编码中,类型的相互转换必不可少,如何完成 char
和 wchar_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++教程-猿说编程
请按任意键继续. . .
*/
五.猜你喜欢
- 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
暂无评论内容