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?
Danke für die Antwort! – Coder12345
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. –