C++字符串编码转换
C++中字符串有很多种类,详情参考。本⽂主要以string类型为例,讲⼀下字符串的编码,选择string主要是因为:
byte是字符串⼆进制编码的最⼩结构,字符串本质上就是⼀个byte数组
C++没有byte类型,第三⽅的byte类型通常是char实现的
char可以直接转换成string,也就是说byte直接转string
代码转⾃,其它编码格式的转换⽅法类似(先转双字节Unicode编码,再通过转换为其它编码的多字节),代码如下:
std::string UTF8_To_string(const std::string& str)
{
int nwLen = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);
wchar_t* pwBuf = new wchar_t[nwLen + 1];//加1⽤于截断字符串
memset(pwBuf, 0, nwLen * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), pwBuf, nwLen);
int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
char* pBuf = new char[nLen + 1];
memset(pBuf, 0, nLen + 1);
WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
unicode编码转换二进制std::string retStr = pBuf;
delete[]pBuf;
delete[]pwBuf;
pBuf = NULL;
pwBuf = NULL;
return retStr;
}
std::string string_To_UTF8(const std::string& str)
{
int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
wchar_t* pwBuf = new wchar_t[nwLen + 1];//加1⽤于截断字符串
ZeroMemory(pwBuf, nwLen * 2 + 2);
::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen);
int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
char* pBuf = new char[nLen + 1];
ZeroMemory(pBuf, nLen + 1);
:
:WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
std::string retStr(pBuf);
delete[]pwBuf;
delete[]pBuf;
pwBuf = NULL;
pBuf = NULL;
return retStr;
}
注:string使⽤的ANSI编码,在简体中⽂系统下ANSI编码代表GB2312编码。
MultiByteToWideChar和WideCharToMultiByte⽤法参考,⽅法的第⼀个参数是指定指针所指字符串内存的编码格式,内容如下:Value Description
CP_ACP ANSI code page
CP_MACCP Not supported
CP_OEMCP OEM code page
CP_SYMBOL Not supported
CP_THREAD_ACP Not supported
CP_UTF7UTF-7 code page
CP_UTF8UTF-8 code page
两个⽅法都会调⽤两次,第⼀次调⽤最后⼀个参数(⽬标字符串长度)为0,⽅法返回⽬标字符串长度的长度。第⼆次调⽤时,最后⼀个参数传⼊⽬标字符串长度+1,直接在缓冲区写⼊转换后的字符串。
注:在linux下也有类似的两个函数:mbstowcs()、wcstombs(),使⽤⽅法参考。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论