我有一个带有初始BOM的unicode字符串(一系列字节)(通常是UTF-16 little-endian),我需要将其转换为ASCII std::string
。
我尝试使用this solution,但它无效visual studio 2015。
如何转换该系列字节?目标系统是Windows。
答案 0 :(得分:3)
这应该适用于visual studio。此函数永远不应该内联,因为它在堆栈上分配临时变量大小的缓冲区。
std::string toMultibyte(const wchar_t* src, UINT codepage = CP_ACP)
{
int wcharCount = static_cast<int>(std::wcslen(src));
int buffSize = WideCharToMultiByte(codepage, 0, src, wcharCount, NULL, 0, NULL, NULL);
char* buff = static_cast<char*>(_alloca(buffSize));
WideCharToMultiByte(codepage, 0, src, wcharCount, buff, buffSize, NULL, NULL);
return std::string(buff, buffSize);
}
如果你的编译器不支持_alloca()
,或者你对此函数有一些偏好,你可以使用这种方法。
template<std::size_t BUFF_SIZE = 0x100>
std::string toMultibyte(const wchar_t* src, UINT codepage = CP_ACP)
{
int wcharCount = static_cast<int>(std::wcslen(src));
int buffSize = WideCharToMultiByte(codepage, 0, src, wcharCount, NULL, 0, NULL, NULL);
if (buffSize <= BUFF_SIZE) {
char buff[BUFF_SIZE];
WideCharToMultiByte(codepage, 0, src, wcharCount, buff, buffSize, NULL, NULL);
return std::string(buff, buffSize);
} else {
auto buff = std::make_unique<char[]>(buffSize);
WideCharToMultiByte(codepage, 0, src, wcharCount, buff.get(), buffSize, NULL, NULL);
return std::string(buff.get(), buffSize);
}
}