变量AnsiStringT模板

问题描述:

我目前使用的转换功能,它看起来像这样(C++ Builder中):变量AnsiStringT模板

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... 
     } 
    } 

但我真的想避免使用庞大的开关/案例 - 是这样的:

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错误。

有没有办法重新做代码,所以我可以使用std::string基于CodePage参数原始数据转换(到UnicodeString)没有一个巨大的开关/案例列表?

确实是有一个很容易处理这种方式 - 使用RawByteString类型和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; 
} 
+0

谢谢回复! – Coder12345

+0

请注意,在非Windows平台上,'UnicodeFromLocaleChars'可能非常慢,因为需要在这些平台上提供区域名称。我开发了一个完美的散列,将其转换得非常快(散列只是一个%和一个排他或IIRC)。我会看一看。这是约。是System.pas中POSIX版本的10倍,并且在某些代码中,这确实可以有所作为。 –