2017-06-21 4 views
0

Ich verwende derzeit die Konvertierungsfunktion, die wie dieser (C++ Builder) aussieht:Variable in AnsiStringT Vorlage

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

Aber ich will wirklich die Verwendung von großen Schalter/Fall vermeiden - etwa so:

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

Das funktioniert nicht und gibt mir E2396 Template argument must be a constant expression Fehler.

Gibt es eine Möglichkeit, den Code zu wiederholen, so dass ich std::string Rohdatenkonvertierung (in UnicodeString) basierend auf CodePage-Parameter ohne eine große Switch/Case-Liste verwenden kann?

Antwort

1

Es ist in der Tat eine viel einfachere Art und Weise zu handhaben - mit dem RawByteString Typ und die SetCodePage() Funktion, zB:

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

Alternativ können Sie die UnicodeFromLocaleChars() Funktion:

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

Danke für die Antwort! – Coder12345

+0

Beachten Sie, dass "UnicodeFromLocaleChars" auf Nicht-Windows-Plattformen ziemlich langsam sein kann, da auf diesen Plattformen ein Gebietsschema-Name angegeben werden muss. Ich habe einen perfekten Hash entwickelt, der das ziemlich schnell konvertiert (der Hash ist nur ein% und ein exklusives oder, IIRC). Ich werde es mir ansehen. Es ist ca. 10-mal so schnell wie die POSIX-Version in System.pas und in gewissem Code kann das wirklich etwas bewirken. –

Verwandte Themen