Windows平台下字符串转换(不全)

鄙人在工作中整理的字符转换方法,分享给大家


头文件: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);
};


头文件:MyCharsConvert.cpp

#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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值