将unicode(带BOM)字符串转换为ASCII std :: string

时间:2015-11-30 16:58:44

标签: c++ string windows unicode utf-16

我有一个带有初始BOM的unicode字符串(一系列字节)(通常是UTF-16 little-endian),我需要将其转换为ASCII std::string

我尝试使用this solution,但它无效visual studio 2015

如何转换该系列字节?目标系统是Windows。

1 个答案:

答案 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);
  }
}