UTF-16转GBK中文

#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;
}

 

请登录后发表评论

    没有回复内容