AnsiStringT 模板中的变量

Variable in AnsiStringT template

我目前使用的转换函数如下所示 (C++ Builder):

UnicodeString OutputInCodePage(const int CodePage, std::string& InStr, const unsigned Offs)
  {
  switch (CodePage)
      {
      default:
      case 0:     return AnsiStringT<0>   (InStr.substr(Offs).c_str());  // System default
      case 037:   return AnsiStringT<037> (InStr.substr(Offs).c_str());  // IBM037   IBM EBCDIC US-Canada
      case 437:   return AnsiStringT<437> (InStr.substr(Offs).c_str());  // IBM437   OEM United States
      case 500:   return AnsiStringT<500> (InStr.substr(Offs).c_str());  // IBM500   IBM EBCDIC International
      // And many more following...
      }
  }

但我真的想避免使用巨大的 switch/case - 像这样:

UnicodeString OutputInCodePage(const int CodePage, std::string& InStr, const unsigned Offs)
  {
  return AnsiStringT<CodePage> (InStr.substr(Offs).c_str());
  }

这不起作用,给我 E2396 Template argument must be a constant expression 错误。

有没有办法重新编写代码,这样我就可以使用基于 CodePage 参数的 std::string 原始数据转换(到 UnicodeString),而无需庞大的 switch/case 列表?

确实有一种更简单的方法来处理这个问题 - 使用 RawByteString type and the SetCodePage() 函数,例如:

UnicodeString OutputInCodePage(const int CodePage, const std::string  &InStr, const unsigned Offs)
{
    RawByteString out(InStr.c_str() + Offs);
    SetCodePage(out, CodePage, false);
    return out;
}

或者,使用 UnicodeFromLocaleChars() 函数:

UnicodeString OutputInCodePage(const int CodePage, const std::string &InStr, const unsigned Offs)
{
    UnicodeString out;

    const char *p_in = InStr.c_str() + Offs;
    int in_len = InStr.length() - Offs;

    int out_len = UnicodeFromLocaleChars(CodePage, 0, p_in, in_len, NULL, 0);
    if (out_len > 0)
    {
        out.SetLength(out_len);
        UnicodeFromLocaleChars(CodePage, 0, p_in, in_len, out.c_str(), out_len);
    }

    return out;
}