static void UTF8toANSI(CString& strUTF8) {
// 确定字符串长度
int len = strUTF8.GetLength();
// 将 CString 转换为 char* 类型的字符串
#ifdef _UNICODE
int nLen = WideCharToMultiByte(CP_UTF8, 0, strUTF8, -1, NULL, 0, NULL, NULL);
if (nLen == 0) {
std::cerr << "WideCharToMultiByte failed" << std::endl;
return;
}
char* utf8Buffer = new char[nLen];
nLen = WideCharToMultiByte(CP_UTF8, 0, strUTF8, -1, utf8Buffer, nLen, NULL, NULL);
if (nLen == 0) {
std::cerr << "WideCharToMultiByte failed" << std::endl;
delete[] utf8Buffer;
return;
}
utf8Buffer[nLen - 1] = 0; // 确保以空字符结尾
// 获取转换为宽字符后需要的缓冲区大小
int wideLen = MultiByteToWideChar(CP_UTF8, 0, utf8Buffer, -1, NULL, 0);
if (wideLen == 0) {
std::cerr << "MultiByteToWideChar failed" << std::endl;
delete[] utf8Buffer;
return;
}
// 创建宽字符缓冲区
WCHAR* wszBuffer = new WCHAR[wideLen];
wideLen = MultiByteToWideChar(CP_UTF8, 0, utf8Buffer, -1, wszBuffer, wideLen);
if (wideLen == 0) {
std::cerr << "MultiByteToWideChar failed" << std::endl;
delete[] utf8Buffer;
delete[] wszBuffer;
return;
}
wszBuffer[wideLen - 1] = 0; // 确保以空字符结尾
delete[] utf8Buffer;
#else
// 获取转换为宽字符后需要的缓冲区大小
int wideLen = MultiByteToWideChar(CP_UTF8, 0, strUTF8, -1, NULL, 0);
if (wideLen == 0) {
std::cerr << "MultiByteToWideChar failed" << std::endl;
return;
}
// 创建宽字符缓冲区
WCHAR* wszBuffer = new WCHAR[wideLen];
wideLen = MultiByteToWideChar(CP_UTF8, 0, strUTF8, -1, wszBuffer, wideLen);
if (wideLen == 0) {
std::cerr << "MultiByteToWideChar failed" << std::endl;
delete[] wszBuffer;
return;
}
wszBuffer[wideLen - 1] = 0; // 确保以空字符结尾
#endif
// 获取转换为多字节字符后需要的缓冲区大小
int ansiLen = WideCharToMultiByte(936, 0, wszBuffer, -1, NULL, 0, NULL, NULL);
if (ansiLen == 0) {
std::cerr << "WideCharToMultiByte failed" << std::endl;
delete[] wszBuffer;
return;
}
// 创建多字节字符缓冲区
char* ansiBuffer = new char[ansiLen];
ansiLen = WideCharToMultiByte(936, 0, wszBuffer, -1, ansiBuffer, ansiLen, NULL, NULL);
if (ansiLen == 0) {
std::cerr << "WideCharToMultiByte failed" << std::endl;
delete[] ansiBuffer;
delete[] wszBuffer;
return;
}
ansiBuffer[ansiLen - 1] = 0; // 确保以空字符结尾
// 将结果赋值给 strUTF8
strUTF8 = ansiBuffer;
// 清理内存
delete[] ansiBuffer;
delete[] wszBuffer;
}
static void ANSItoUTF8(CString& strANSI) {
// 确定字符串长度
int len = strANSI.GetLength();
// 获取 ANSI 字符串的底层指针
const TCHAR* pszANSI = strANSI;
// 将 ANSI 字符串转换为宽字符字符串
int wideLen = 0;
WCHAR* wszBuffer = nullptr;
#ifdef _UNICODE
// 如果是 Unicode 编译模式,需要先将 wchar_t* 转换为 char*
int ansiLen = WideCharToMultiByte(936, 0, pszANSI, -1, NULL, 0, NULL, NULL);
if (ansiLen == 0) {
std::cerr << "WideCharToMultiByte failed" << std::endl;
return;
}
char* ansiBuffer = new char[ansiLen];
ansiLen = WideCharToMultiByte(936, 0, pszANSI, -1, ansiBuffer, ansiLen, NULL, NULL);
if (ansiLen == 0) {
std::cerr << "WideCharToMultiByte failed" << std::endl;
delete[] ansiBuffer;
return;
}
ansiBuffer[ansiLen - 1] = 0; // 确保以空字符结尾
wideLen = MultiByteToWideChar(936, 0, ansiBuffer, -1, NULL, 0);
if (wideLen == 0) {
std::cerr << "MultiByteToWideChar failed" << std::endl;
delete[] ansiBuffer;
return;
}
wszBuffer = new WCHAR[wideLen];
wideLen = MultiByteToWideChar(936, 0, ansiBuffer, -1, wszBuffer, wideLen);
if (wideLen == 0) {
std::cerr << "MultiByteToWideChar failed" << std::endl;
delete[] ansiBuffer;
delete[] wszBuffer;
return;
}
wszBuffer[wideLen - 1] = 0; // 确保以空字符结尾
delete[] ansiBuffer;
#else
wideLen = MultiByteToWideChar(936, 0, pszANSI, -1, NULL, 0);
if (wideLen == 0) {
std::cerr << "MultiByteToWideChar failed" << std::endl;
return;
}
wszBuffer = new WCHAR[wideLen];
wideLen = MultiByteToWideChar(936, 0, pszANSI, -1, wszBuffer, wideLen);
if (wideLen == 0) {
std::cerr << "MultiByteToWideChar failed" << std::endl;
delete[] wszBuffer;
return;
}
wszBuffer[wideLen - 1] = 0; // 确保以空字符结尾
#endif
// 获取转换为 UTF-8 后需要的缓冲区大小
int utf8Len = WideCharToMultiByte(CP_UTF8, 0, wszBuffer, -1, NULL, 0, NULL, NULL);
if (utf8Len == 0) {
std::cerr << "WideCharToMultiByte failed" << std::endl;
delete[] wszBuffer;
return;
}
// 创建 UTF-8 缓冲区
char* utf8Buffer = new char[utf8Len];
utf8Len = WideCharToMultiByte(CP_UTF8, 0, wszBuffer, -1, utf8Buffer, utf8Len, NULL, NULL);
if (utf8Len == 0) {
std::cerr << "WideCharToMultiByte failed" << std::endl;
delete[] utf8Buffer;
delete[] wszBuffer;
return;
}
utf8Buffer[utf8Len - 1] = 0; // 确保以空字符结尾
// 将结果赋值给 strANSI
strANSI = utf8Buffer;
// 清理内存
delete[] utf8Buffer;
delete[] wszBuffer;
}
CString str1 = _T("我爱你侃大山");
UTF8toANSI(str1 );
CString str0 = str1 ;
ANSItoUTF8(str0 );
str1 != str0 ;