navicat-keygen/common/TString.cpp
2019-03-01 01:37:16 +08:00

333 lines
12 KiB
C++

#include "TString.hpp"
#include "ExceptionSystem.hpp"
#undef __BASE_FILE__
#define __BASE_FILE__ TEXT("TString.cpp")
TString TStringBuilder(PCSTR LpMultiByteStr, UINT CodePage) {
#ifdef _UNICODE
TString TStr;
int RequiredSize = MultiByteToWideChar(CodePage,
NULL,
LpMultiByteStr,
-1,
NULL,
0);
if (RequiredSize == 0)
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("MultiByteToWideChar failed."));
TStr.resize(RequiredSize);
if (!MultiByteToWideChar(CP_ACP,
NULL,
LpMultiByteStr,
-1,
TStr.data(),
RequiredSize))
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("MultiByteToWideChar failed."));
while (TStr.back() == L'\x00')
TStr.pop_back();
return TStr;
#else
if (CodePage == CP_ACP) {
return TString(LpMultiByteStr);
} else {
std::wstring WideCharStr;
TString TStr;
int RequiredSize = MultiByteToWideChar(CodePage,
NULL,
LpMultiByteStr,
-1,
NULL,
0);
if (RequiredSize == 0)
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("MultiByteToWideChar failed."));
WideCharStr.resize(RequiredSize);
if (!MultiByteToWideChar(CP_ACP,
NULL,
LpMultiByteStr,
-1,
WideCharStr.data(),
RequiredSize))
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("MultiByteToWideChar failed."));
while (WideCharStr.back() == L'\x00')
WideCharStr.pop_back();
RequiredSize = WideCharToMultiByte(CP_ACP,
NULL,
WideCharStr.c_str(),
-1,
NULL,
0,
NULL,
NULL);
if (RequiredSize == 0)
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("WideCharToMultiByte failed."));
TStr.resize(RequiredSize);
if (!WideCharToMultiByte(CP_ACP,
NULL,
WideCharStr.c_str(),
-1,
TStr.data(),
RequiredSize,
NULL,
NULL))
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("WideCharToMultiByte failed."));
while (TStr.back() == '\x00')
TStr.pop_back();
return TStr;
}
#endif
}
TString TStringBuilder(PCWSTR LpWideCharStr) {
#ifdef _UNICODE
return TString(LpWideCharStr);
#else
TString TStr;
int RequiredSize = WideCharToMultiByte(CP_ACP,
NULL,
LpWideCharStr,
-1,
NULL,
0,
NULL,
NULL);
if (RequiredSize == 0)
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("WideCharToMultiByte failed."));
TStr.resize(RequiredSize);
if (!WideCharToMultiByte(CP_ACP,
NULL,
LpWideCharStr,
-1,
TStr.data(),
RequiredSize,
NULL,
NULL))
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("WideCharToMultiByte failed."));
while (TStr.back() == '\x00')
TStr.pop_back();
return TStr;
#endif
}
TString TStringBuilder(const std::string& RefMultiByteStr, UINT CodePage) {
return TStringBuilder(RefMultiByteStr.c_str(), CodePage);
}
TString TStringBuilder(const std::wstring& RefWideCharStr) {
return TStringBuilder(RefWideCharStr.c_str());
}
std::string TStringEncode(PTSTR LpTString, UINT CodePage) {
std::string MultiByteStr;
int RequiredSize;
#ifdef _UNICODE
RequiredSize = WideCharToMultiByte(CodePage,
NULL,
LpTString,
-1,
NULL,
0,
NULL,
NULL);
if (RequiredSize == 0)
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("WideCharToMultiByte failed."));
MultiByteStr.resize(RequiredSize);
if (!WideCharToMultiByte(CodePage,
NULL,
LpTString,
-1,
MultiByteStr.data(),
RequiredSize,
NULL,
NULL))
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("WideCharToMultiByte failed."));
while (MultiByteStr.back() == '\x00')
MultiByteStr.pop_back();
#else
if (CodePage == CP_ACP)
return RefTStr;
std::wstring WideCharStr;
RequiredSize = MultiByteToWideChar(CP_ACP,
NULL,
LpTString,
-1,
NULL,
0);
if (RequiredSize == 0)
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("MultiByteToWideChar failed."));
WideCharStr.resize(RequiredSize);
if (!MultiByteToWideChar(CP_ACP,
NULL,
LpTString,
-1,
WideCharStr.data(),
RequiredSize))
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("MultiByteToWideChar failed."));
while (WideCharStr.back() == L'\x00')
WideCharStr.pop_back();
RequiredSize = WideCharToMultiByte(CodePage,
NULL,
WideCharStr.c_str(),
-1,
NULL,
0,
NULL,
NULL);
if (RequiredSize == 0)
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("WideCharToMultiByte failed."));
MultiByteStr.resize(RequiredSize);
if (!WideCharToMultiByte(CodePage,
NULL,
WideCharStr.c_str(),
-1,
MultiByteStr.data(),
RequiredSize,
NULL,
NULL))
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("WideCharToMultiByte failed."));
while (MultiByteStr.back() == '\x00')
MultiByteStr.pop_back();
#endif
return MultiByteStr;
}
std::string TStringEncode(const TString& RefTStr, UINT CodePage) {
std::string MultiByteStr;
int RequiredSize;
#ifdef _UNICODE
RequiredSize = WideCharToMultiByte(CodePage,
NULL,
RefTStr.c_str(),
-1,
NULL,
0,
NULL,
NULL);
if (RequiredSize == 0)
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("WideCharToMultiByte failed."));
MultiByteStr.resize(RequiredSize);
if (!WideCharToMultiByte(CodePage,
NULL,
RefTStr.c_str(),
-1,
MultiByteStr.data(),
RequiredSize,
NULL,
NULL))
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("WideCharToMultiByte failed."));
while (MultiByteStr.back() == '\x00')
MultiByteStr.pop_back();
#else
if (CodePage == CP_ACP)
return RefTStr;
std::wstring WideCharStr;
RequiredSize = MultiByteToWideChar(CP_ACP,
NULL,
RefTStr.c_str(),
-1,
NULL,
0);
if (RequiredSize == 0)
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("MultiByteToWideChar failed."));
WideCharStr.resize(RequiredSize);
if (!MultiByteToWideChar(CP_ACP,
NULL,
RefTStr.c_str(),
-1,
WideCharStr.data(),
RequiredSize))
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("MultiByteToWideChar failed."));
while (WideCharStr.back() == L'\x00')
WideCharStr.pop_back();
RequiredSize = WideCharToMultiByte(CodePage,
NULL,
WideCharStr.c_str(),
-1,
NULL,
0,
NULL,
NULL);
if (RequiredSize == 0)
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("WideCharToMultiByte failed."));
MultiByteStr.resize(RequiredSize);
if (!WideCharToMultiByte(CodePage,
NULL,
WideCharStr.c_str(),
-1,
MultiByteStr.data(),
RequiredSize,
NULL,
NULL))
throw SystemException(__BASE_FILE__, __LINE__, GetLastError(),
TEXT("WideCharToMultiByte failed."));
while (MultiByteStr.back() == '\x00')
MultiByteStr.pop_back();
#endif
return MultiByteStr;
}
TString TStringDecode(PCSTR LpMultiByteStr, UINT CodePage) {
return TStringBuilder(LpMultiByteStr, CodePage);
}
TString TStringDecode(const std::string& RefMultiByteStr, UINT CodePage) {
return TStringBuilder(RefMultiByteStr.c_str(), CodePage);
}