本文主要侧重宽字符和多字节字符的转换。其实这里面还涉及到字符集的转换,为了大家的理解,我们在此不过多介绍。
一、windows
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
wchar_t wideChar[] = L"我是一个宽字符";
char * multiByte;
int len = WideCharToMultiByte(CP_ACP, NULL,
wideChar,
-1,
NULL,
NULL,
NULL, NULL);
multiByte = new char[len];
WideCharToMultiByte(CP_ACP, NULL,
wideChar,
-1,
multiByte,
len,
NULL, NULL);
cout << multiByte << endl;
delete multiByte;
system("pause");
return 0;
}
输出
我是一个宽字符 请按任意键继续. . .
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "chs");
char multiByte[] = "我是一个多字节字符串。";
WCHAR * wideChar;
int len = MultiByteToWideChar(CP_ACP, NULL,
multiByte,
-1,
NULL,
0);
wideChar = new WCHAR[len];
MultiByteToWideChar(CP_ACP, NULL,
multiByte,
-1,
wideChar,
len);
wcout << wideChar << endl;
delete wideChar;
system("pause");
return 0;
}
输出
我是一个多字节字符串。
参见:多字节和宽字符之间的转换方法
二、linux
- iconv.h
- linux下的原型函数
- 不单单可以做宽字符和多字节字符的转换,还可以用做不同字符编码的转换。
这个用的不多,而且c++20提供了相应的函数转换,在此不做过多研究,后面会整理一篇c++ 20提供的字符转换函数。
参见:linux 宽字符与多字节字符之间的转换
三、c语言
-
c语言提供了wcstombs、mbstowcs(不安全) -
(因为不安全,在vs2017中已经编译不过了,让用更加安全的wcstombs_s、mbstowcs_s,想要编译通过,可以在visual中:项目右键 – 属性 – C/C++ – 预处理器 – 预处理器定义,在里面添加 _CRT_SECURE_NO_DEPRECATE 即可) -
windows和linux都可以使用; -
存在《四、wchar_t》中备注说的问题:【字符集二】多字节字符vs宽字符 -
wcstombs_s、mbstowcs_s是微软提供的,linux下肯定是无法使用的。
size_t wcstombs (char* dest, const wchar_t* src, size_t max); Convert wide-character string to multibyte string
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define BUFFER_SIZE 50
int main()
{
setlocale(LC_ALL, "chs");
size_t ret;
char mb[50];
wchar_t wc[] = L"我是一个宽字符";
ret = wcstombs(mb, wc, BUFFER_SIZE);
printf("要转换的字符数 = %u\n", ret);
printf("多字节字符 = %s\n\n", mb);
return(0);
}
输出
要转换的字符数 = 14 多字节字符 = 我是一个宽字符
size_t mbstowcs (wchar_t* dest, const char* src, size_t max); Convert multibyte string to wide-character string
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define BUFFER_SIZE 50
int main()
{
setlocale(LC_ALL, "chs");
char mbyte[50];
wchar_t * wbyte =NULL;
strcpy(mbyte, "我是一个多字节字符");
size_t mlen = strlen(mbyte);
int dSize = mbstowcs(wbyte, mbyte, 0) + 1;
wbyte = new wchar_t[dSize];
wmemset(wbyte, 0, dSize);
int len = mbstowcs(wbyte, mbyte, mlen);
return(0);
}
参见: 1、wcstombs 2、mbstowcs()/wcstombs()
四、宽字符和多字节字符的本质
见:汉字我的宽字符码和多字节码分别是多少
五、其他
1.宽字符wchar_t和窄字符char区别和相互转换 2.基于 C++ Boost locale 库,将 utf8,utf16,utf32 字符集互相转换 3.boost库学习随记五 Boost.Locale 之字符转换 gbk utf8 big5 string wstring等 4.windows API实现中文中字符串与GBK、Unicode、UTF-8三种编码互转 5.boost::locale::conv:: 字符编码转换 6.对C++ Local的经典分析
|