#pragma once
#include <windows.h>
#include <string>
namespace Util{ //start namespace
int SEU_Rand(int ran); //自定义的随机数发生器
/************************************************************************/
/*
三种编码格式互转
UTF-8 <===> GB2312
∧ ∧
| |
| |
∨ ∨
Unicode
UTF-8和GB2312可以用strlen来计算长度
Unicode要wsclen(p)*2=字符串长度. 因为unicode一个ansi字符也占2字节. 一个汉字也占2字节.
*/
/************************************************************************/
//UTF-8到GB2312的转换,返回的指针要delete
char* UTF8_To_GB2312(const char* utf8);
//string版
std::string UTF8_To_GB2312( const std::string &utf8 );
//GB2312到UTF-8的转换,返回的指针要delete
char* GB2312_To_UTF8(const char* gb2312);
//string版
std::string GB2312_To_UTF8( const std::string &gb2312 );
char* UTF8_To_Unicode( IN const char* utf8, OUT int & len);//参数2是为了方便知道unicode的字符串长度.也可以用wsclen来计算该函数返回的unicode char*指针.来统计unicode的字符数.x2就是字符串长度
//string版
std::wstring UTF8_To_Unicode( const std::string &utf8 );
char* Unicode_To_UTF8(const char* unicode);
//string版
std::string Unicode_To_UTF8(const std::wstring &unicode );
//等同于MByteToWChar. 内部调用了MByteToWChar
char* GB2312_To_Unicode(const char* gb2312,int & len);
//string版
std::wstring GB2312_To_Unicode( const std::string &gb2312 );
//等同与WCharToMByte 内部调用了WCharToMByte
char* Unicode_To_GB2312(const char* unicode);
//string版
std::string Unicode_To_GB2312(const std::wstring &unicode );
/*
宽字符转多字节
注意返回的字符串不用后要delete
*/
CHAR* WCharToMByte(WCHAR* lpcwszStr); //其实就是unicode 转ansi/gb2312
/*
多字节转宽字符
注意返回的字符串不用后要delete
*/
WCHAR* MByteToWChar(CHAR* lpcstr);
static inline std::string convWith( const std::wstring &src );
static inline std::wstring convWith( const std::string &src );
}; //end namespace
#include "stdafx.h"
#include "util.h"
namespace Util{ //start namespace
/************************************************************************/
/*
936 (GB2312)
Chinese (PRC, Singapore)
950 (GBK)
Chinese (Taiwan; Hong Kong SAR, PRC)
65001
UTF-8
*/
/************************************************************************/
#define CODE_PAGE_GB2312 936
int SEU_Rand(int ran)//自定义的随机数发生器
{
unsigned long Time=GetTickCount();
int seed=rand()+3;
seed=(seed*Time)%ran;
return seed;
}
//__开头的都是内部函数..
BOOL __WChar2MByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)
{
DWORD dwMinSize;
dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
if(dwSize < dwMinSize)
{
return FALSE;
}
WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);
return TRUE;
}
char* WCharToMByte(WCHAR* lpcwszStr)
{
//所需的短字符数组空间的个数
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,0,lpcwszStr,-1,NULL,0,NULL,FALSE)+4;
//printf("长度:%d\n",dwNum);
char* temp=new char[dwNum];
__WChar2MByte(lpcwszStr,temp,dwNum);
return temp;
}
WCHAR* MByteToWChar (CHAR* lpcstr)
{
LPWSTR pszOut = NULL;
if (lpcstr != NULL)
{
int nInputStrLen = (int)strlen (lpcstr);
// Double NULL Termination
int nOutputStrLen = MultiByteToWideChar(CODE_PAGE_GB2312, 0, lpcstr, nInputStrLen, NULL, 0) + 2;
pszOut = new WCHAR [nOutputStrLen];
if(pszOut)
{
memset (pszOut, 0x00, sizeof (WCHAR)*nOutputStrLen);
MultiByteToWideChar (CODE_PAGE_GB2312, 0, lpcstr, nInputStrLen, pszOut, nInputStrLen);
}
}
return pszOut;
}
//UTF-8到GB2312的转换
char* UTF8_To_GB2312(const char* utf8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
len = WideCharToMultiByte(CODE_PAGE_GB2312, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CODE_PAGE_GB2312, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
return str;
}
//GB2312到UTF-8的转换
char* GB2312_To_UTF8(const char* gb2312)
{
int len = MultiByteToWideChar(CODE_PAGE_GB2312, 0, gb2312, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CODE_PAGE_GB2312, 0, gb2312, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
return str;
}
std::string GB2312_To_UTF8( const std::string &gb2312 )
{
char* utf8=GB2312_To_UTF8((const char*)gb2312.c_str());
std::string str_utf8=(utf8);
delete utf8;
return str_utf8;
}
std::string UTF8_To_GB2312( const std::string &utf8 )
{
char* gb2312=UTF8_To_GB2312((const char*)utf8.c_str());
std::string str_gb2312=(gb2312);
delete gb2312;
return str_gb2312;
}
char* GB2312_To_Unicode(const char* gb2312,int & len)
{
//gb2312转unicode
WCHAR* w=MByteToWChar((char*)gb2312);
len=wcslen(w)*2;
return (char*)w;
}
std::wstring GB2312_To_Unicode( const std::string &gb2312 )
{
int len;
return std::wstring( (wchar_t*) GB2312_To_Unicode((const char*) gb2312.c_str() , len ) );
}
char* UTF8_To_Unicode(const char* utf8,int & len)
{
//先utf8 转 gb2312
char* gb2312=UTF8_To_GB2312(utf8);
//gb2312转unicode
WCHAR* w=MByteToWChar(gb2312);
delete gb2312;
len=wcslen(w)*2;
return (char*)w;
}
std::wstring UTF8_To_Unicode( const std::string &utf8 )
{
int len;
return std::wstring( (wchar_t*) UTF8_To_Unicode((const char*) utf8.c_str(),len));
}
char* Unicode_To_UTF8(const char* unicode )
{
//先unicode 转 gb2312
char* gb2312=WCharToMByte((WCHAR*)unicode);
//gb2312 转utf8
char* utf8=GB2312_To_UTF8(gb2312);
delete gb2312;
return utf8;
}
std::string Unicode_To_UTF8( const std::wstring &unicode )
{
return std::string( Unicode_To_UTF8((const char*)unicode.c_str()));
}
char* Unicode_To_GB2312(const char* unicode)
{
char*gb2312=WCharToMByte((WCHAR*)unicode);
return gb2312;
}
std::string Unicode_To_GB2312(const std::wstring &unicode )
{
return std::string( Unicode_To_GB2312((const char*)unicode.c_str()) );
}
/*
static inline std::string convWith( const std::wstring &src )
{
u32 destSize = 2 * src.size() + 1;
c8 *destData = new c8[destSize];
wcstombs_s( 0, destData, destSize, src.c_str(), destSize );
std::string temp( destData );
delete [] destData;
return temp;
}
static inline std::wstring convWith( const std::string &src )
{
u32 destSize = src.size() * 2;
wchar_t *destData = new wchar_t[destSize];
mbstowcs_s( 0, destData, destSize, src.c_str(), destSize );
std::wstring temp( destData );
delete [] destData;
return temp;
}
*/
}; //end namespace