鄙人在工作中整理的字符转换方法,分享给大家
头文件:MyCharsConvert.h
#pragma once
#include <string>
class MyCharsConvert
{
public:
MyCharsConvert(void);
public:
~MyCharsConvert(void);
public:
// ansi characters convert to unicode 16
static std::wstring ANSIToUTF16(std::string AnsiChars);
// utf16 to ansi
static std::string UTF16ToANSI(std::wstring Utf16Chars);
// utf-8 to ansi
static std::string UTF8ToANSI(std::string utf8Chars);
// ansi to utf-8
static std::string ANSIToUTF8(std::string ansiChars);
private:
char* Convert(const char* strIn, int sourceCodepage, int targetCodepage);
};
#include "StdAfx.h"
#include <windows.h>
#include "MyCharsConvert.h"
MyCharsConvert::MyCharsConvert(void)
{
}
MyCharsConvert::~MyCharsConvert(void)
{
}
// ansi characters convert to unicode 16
std::wstring MyCharsConvert::ANSIToUTF16(std::string ansiChars)
{
//入参检查
if (ansiChars.empty()) return std::wstring();
wchar_t *pszBuf = NULL;
//利用WideCharToMultiByte方法获取需要的大小
int needWChar = MultiByteToWideChar(CP_ACP, 0, ansiChars.c_str(), -1, NULL, 0);
if (needWChar > 0){
pszBuf = new wchar_t[needWChar+1];
if (!pszBuf)
{
return std::wstring();
}
ZeroMemory(pszBuf, (needWChar+1)*sizeof(wchar_t));
//窄字符到宽字符的转化
MultiByteToWideChar(CP_ACP, 0, ansiChars.c_str(), -1, pszBuf, needWChar);
}
std::wstring wstrRet(pszBuf);
delete[] pszBuf;
pszBuf = NULL;
return wstrRet;
}
std::string MyCharsConvert::UTF16ToANSI(std::wstring utf16Chars)
{
//入参检查
if (utf16Chars.empty()) return std::string();
char *pszBuf = NULL;
//利用WideCharToMultiByte方法获取需要的大小
int needBytes = WideCharToMultiByte(CP_ACP, 0, utf16Chars.c_str(), -1, NULL, 0, NULL, NULL);
if (needBytes > 0){
pszBuf = new char[needBytes+1];
if (!pszBuf)
{
return std::string("");
}
ZeroMemory(pszBuf, (needBytes+1)*sizeof(char));
//宽字符到窄字符的转化
WideCharToMultiByte(CP_ACP, 0, utf16Chars.c_str(), -1, pszBuf, needBytes, NULL, NULL);
}
std::string strRet(pszBuf);
delete[] pszBuf;
pszBuf = NULL;
return strRet;
}
// utf-8 to ansi
std::string MyCharsConvert::UTF8ToANSI(std::string utf8Chars)
{
char* pszRet = Convert(utf8Chars.c_str(), CP_UTF8, CP_ACP);
if (NULL == pszRet)
{
return std::string("");
}
std::string strRet(pszRet);
delete[] pszRet;
pszRet = NULL;
return strRet;
}
// ansi to utf-8
std::string MyCharsConvert::ANSIToUTF8(std::string ansiChars)
{
char* pszRet = Convert(ansiChars.c_str(),CP_ACP,CP_UTF8);
if (NULL == pszRet)
{
return std::string("");
}
std::string strRet(pszRet);
delete[] pszRet;
pszRet = NULL;
return strRet;
}
/**
* @brief 字符转换
* 利用线程ThreadFunc来获取POST请求返回的数据
* @param [in] sourceCodepage 输入strIn的字符集
* @param [in] targetCodepage 输出目标的字符集
* @return strIn对应的targetCodepage字符串
* @warning Convert返回值是char*,需要调用者用完返回的结果后,手动delete Convert的返回值
*/
char* MyCharsConvert::Convert(const char* strIn, int sourceCodepage, int targetCodepage)
{
///1.获取strIn的字符长度
int len=strlen(strIn);
///2.获取strIn字符到unicode字符集所需要的长度
int unicodeLen=MultiByteToWideChar(sourceCodepage,0,strIn,-1,NULL,0);
wchar_t* pUnicode = NULL;
///3.申请对应长度的wchar_t字符串
pUnicode=new wchar_t[unicodeLen+1];
if (NULL == pUnicode)
{
return NULL;
}
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
///4.将strIn转换成Unicode字符集
MultiByteToWideChar(sourceCodepage,0,strIn,-1,(LPWSTR)pUnicode,unicodeLen);
BYTE * pTargetData = NULL;
///5.获取从Unicode字符集到targetCodepage所需要的长度
int targetLen=WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,0,NULL,NULL);
///6.申请对应长度的内存
pTargetData=new BYTE[targetLen+1];
if (NULL == pTargetData)
{
return NULL;
}
memset(pTargetData,0,targetLen+1);
///7.实现到targetCodepage字符集的转换
WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char *)pTargetData,targetLen,NULL,NULL);
//strcpy(strOut,(char*)pTargetData);
delete[] pUnicode;
///8.返回转换的结果
return (char*)pTargetData;
}