2017-06-21 78 views
0

我目前使用的轉換功能,它看起來像這樣(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)沒有一個巨大的開關/案例列表?

回答

1

確實是有一個很容易處理這種方式 - 使用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倍,並且在某些代碼中,這確實可以有所作爲。 –