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