将 unicode(带 BOM)字符串转换为 ASCII std::string
Converting a unicode (with BOM) string to ASCII std::string
我有一个带有初始 BOM 的 unicode 字符串(一系列字节)(通常是 UTF-16 little-endian),我需要将其转换为 ASCII std::string
。
我尝试使用 this solution but it didn't work on visual studio 2015。
如何转换该系列字节?目标系统将是 Windows.
这应该适用于 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);
}
}
我有一个带有初始 BOM 的 unicode 字符串(一系列字节)(通常是 UTF-16 little-endian),我需要将其转换为 ASCII std::string
。
我尝试使用 this solution but it didn't work on visual studio 2015。
如何转换该系列字节?目标系统将是 Windows.
这应该适用于 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);
}
}