将 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);
  }
}