#include <windows.h>
#include <iostream>
#include <vector>
std::string ConvertUTF16ToGBK(const BYTE* buffer, size_t bufferSize) {
// 处理BOM和字节序
bool isBigEndian = false;
const BYTE* dataStart = buffer;
size_t dataSize = bufferSize;
if (dataSize >= 2) {
if (dataStart[0] == 0xFF && dataStart[1] == 0xFE) {
dataStart += 2;
dataSize -= 2;
isBigEndian = false;
}
else if (dataStart[0] == 0xFE && dataStart[1] == 0xFF) {
dataStart += 2;
dataSize -= 2;
isBigEndian = true;
}
}
// 准备宽字符缓冲区
std::vector<wchar_t> wcharBuffer;
size_t charCount = dataSize / 2;
if (isBigEndian) {
wcharBuffer.reserve(charCount);
for (size_t i = 0; i < charCount; ++i) {
wchar_t c = (dataStart[i * 2] << 8) | dataStart[i * 2 + 1];
wcharBuffer.push_back(c);
}
}
else {
wcharBuffer.resize(charCount + 1);
memcpy(wcharBuffer.data(), dataStart, dataSize);
wcharBuffer[charCount] = L'\0'; // 确保宽字符串正确终止
}
// 转换为GBK
int gbkLen = WideCharToMultiByte(936, 0, wcharBuffer.data(), static_cast<int>(charCount),
nullptr, 0, nullptr, nullptr);
if (gbkLen == 0) return "";
std::vector<char> gbkBuffer(gbkLen + 1);
WideCharToMultiByte(936, 0, wcharBuffer.data(), static_cast<int>(charCount),
gbkBuffer.data(), gbkLen, nullptr, nullptr);
gbkBuffer[gbkLen] = '\0';
return std::string(gbkBuffer.data());
}
int main() {
// 测试数据:"植物大战僵尸中文版"的UTF-16 LE编码(不含BOM)
BYTE testData[] = { 0x0D,0x69,0x69,0x72,0x27,0x59,0x18,0x62,0xF5,0x50,0x38,0x5C,0x2D,0x4E,0x87,0x65,0x48,0x72,0x00,0x00,0x00,0x00,0x00 };
std::string result = ConvertUTF16ToGBK(testData, sizeof(testData));
std::cout << "转换结果:" << result << std::endl;
return 0;
}
没有回复内容