From f2d60629a09c64f9ca93355fde89b1bece11eb79 Mon Sep 17 00:00:00 2001 From: kiritow <1362050620@qq.com> Date: Tue, 23 May 2017 22:31:57 +0800 Subject: [PATCH] Use new UTF8-GBK converter. --- MiniEngine_Windows.cpp | 125 ++++++++++++++--------------------------- 1 file changed, 42 insertions(+), 83 deletions(-) diff --git a/MiniEngine_Windows.cpp b/MiniEngine_Windows.cpp index b07522e..a383a3b 100644 --- a/MiniEngine_Windows.cpp +++ b/MiniEngine_Windows.cpp @@ -3,118 +3,77 @@ using namespace std; #include -//GBK编码转换到UTF8编码 -int _GBKToUTF8(unsigned char * lpGBKStr,unsigned char * lpUTF8Str,int nUTF8StrLen) +void _utf8_to_gb(const char* src, char* dst, int len) { - wchar_t * lpUnicodeStr = NULL; - int nRetLen = 0; - - if(!lpGBKStr) //如果GBK字符串为NULL则出错退出 - return 0; - - nRetLen = MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,NULL,0); //获取转换到Unicode编码后所需要的字符空间长度 - lpUnicodeStr = new WCHAR[nRetLen + 1]; //为Unicode字符串空间 - nRetLen = ::MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,lpUnicodeStr,nRetLen); //转换到Unicode编码 - if(!nRetLen) //转换失败则出错退出 - return 0; - - nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,NULL,0,NULL,0); //获取转换到UTF8编码后所需要的字符空间长度 - - if(!lpUTF8Str) //输出缓冲区为空则返回转换后需要的空间大小 - { - if(lpUnicodeStr) - delete []lpUnicodeStr; - return nRetLen; + int ret = 0; + WCHAR* strA; + int i= MultiByteToWideChar(CP_UTF8, 0, src, -1, NULL, 0); + if (i <= 0) { + printf("ERROR."); + return; + } + strA = (WCHAR*)malloc(i * 2); + MultiByteToWideChar(CP_UTF8, 0, src, -1, strA, i); + i = WideCharToMultiByte(CP_ACP, 0, strA, -1, NULL, 0, NULL, NULL); + if (len >= i) { + ret = WideCharToMultiByte(CP_ACP, 0, strA, -1, dst, i, NULL, NULL); + dst[i] = 0; + } + if (ret <= 0) { + free(strA); + return; } - if(nUTF8StrLen < nRetLen) //如果输出缓冲区长度不够则退出 - { - if(lpUnicodeStr) - delete []lpUnicodeStr; - return 0; - } - - nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,(char *)lpUTF8Str,nUTF8StrLen,NULL,NULL); //转换到UTF8编码 - - if(lpUnicodeStr) - delete []lpUnicodeStr; - - return nRetLen; + free( strA ); } -// UTF8编码转换到GBK编码 -int _UTF8ToGBK(unsigned char * lpUTF8Str,unsigned char * lpGBKStr,int nGBKStrLen) +void _gb_to_utf8(const char* src, char* dst, int len) { - wchar_t * lpUnicodeStr = NULL; - int nRetLen = 0; - - if(!lpUTF8Str) //如果UTF8字符串为NULL则出错退出 - return 0; - - nRetLen = ::MultiByteToWideChar(CP_UTF8,0,(char *)lpUTF8Str,-1,NULL,0); //获取转换到Unicode编码后所需要的字符空间长度 - lpUnicodeStr = new WCHAR[nRetLen + 1]; //为Unicode字符串空间 - nRetLen = ::MultiByteToWideChar(CP_UTF8,0,(char *)lpUTF8Str,-1,lpUnicodeStr,nRetLen); //转换到Unicode编码 - if(!nRetLen) //转换失败则出错退出 - return 0; - - nRetLen = ::WideCharToMultiByte(CP_ACP,0,lpUnicodeStr,-1,NULL,0,NULL,NULL); //获取转换到GBK编码后所需要的字符空间长度 - - if(!lpGBKStr) //输出缓冲区为空则返回转换后需要的空间大小 - { - if(lpUnicodeStr) - delete []lpUnicodeStr; - return nRetLen; + int ret = 0; + WCHAR* strA; + int i= MultiByteToWideChar(CP_ACP, 0, src, -1, NULL, 0); + if (i <= 0) { + printf("ERROR."); + return; + } + strA = (WCHAR*)malloc(i * 2); + MultiByteToWideChar(CP_ACP, 0, src, -1, strA, i); + i = WideCharToMultiByte(CP_UTF8, 0, strA, -1, NULL, 0, NULL, NULL); + if (len >= i) { + ret = WideCharToMultiByte(CP_UTF8, 0, strA, -1, dst, i, NULL, NULL); + dst[i] = 0; } - if(nGBKStrLen < nRetLen) //如果输出缓冲区长度不够则退出 - { - if(lpUnicodeStr) - delete []lpUnicodeStr; - return 0; + if (ret <= 0) { + free(strA); + return; } - - nRetLen = ::WideCharToMultiByte(CP_ACP,0,lpUnicodeStr,-1,(char *)lpGBKStr,nRetLen,NULL,NULL); //转换到GBK编码 - - if(lpUnicodeStr) - delete []lpUnicodeStr; - - return nRetLen; + free(strA); } - string UTF8ToGBK(string UTF8String) { int sz=UTF8String.size()*2/3+256; - auto utf8str=new unsigned char[sz]; - memset(utf8str,0,sz); - memcpy(utf8str,UTF8String.c_str(),UTF8String.size()); - - auto gbkstr=new unsigned char[sz]; + auto gbkstr=new char[sz]; memset(gbkstr,0,sz); - _UTF8ToGBK(utf8str,gbkstr,sz); + _utf8_to_gb(UTF8String.c_str(),gbkstr,sz); string s((char*)gbkstr); delete[] gbkstr; - delete[] utf8str; return s; } string GBKToUTF8(string GBKString) { int sz=GBKString.size()*3/2+32; - auto gbkstr=new unsigned char[sz]; - memset(gbkstr,0,sz); - memcpy(gbkstr,GBKString.c_str(),GBKString.size()); - - auto utf8str=new unsigned char[sz]; + auto utf8str=new char[sz]; memset(utf8str,0,sz); - _GBKToUTF8(gbkstr,utf8str,sz); + _gb_to_utf8(GBKString.c_str(),utf8str,sz); - string s((char*)utf8str); + string s(utf8str); - delete[] gbkstr; delete[] utf8str; return s; }