请推荐我用于C ++字符串的通用库。我想在一个构建中操作ascii文本和unicode文本,而不为std :: string / char和std :: wstring / wchar创建两个版本的构建;我也希望将它们转换为彼此(可能的地方);
非常感谢!!!
答案 0 :(得分:5)
然后使用std::wstring
。 ASCII是Unicode的完美子集(ISO 8859-1 Latin-1位于中间)。 ASCII 0x5D是U + 005D等。
答案 1 :(得分:4)
我假设这是因为您正在谈论使用wchar_t
进行Unicode,而我们正在讨论Windows框。我不打算制作两个单独的版本 - 再也没有人支持仅支持ANSI的版本。如果你必须这样做,只需使用std::basic_string<TCHAR>
(即typedef std::basic_string<TCHAR> tstring
)并从那里开始。
两者之间的转换将特定于区域设置 - 即,您必须知道在进行实际转换之前要转换的特定窄字符代码页。 Win32提供WideCharToMultiByte
和MultiByteToWideChar
来完成这些类型的转换。
答案 2 :(得分:4)
如果要在Windows上转换UTF8字符串和UTF16 wstring,可以在WideCharToMultiByte和MultiByteToWideChar WIN32 API函数周围使用瘦包装器:
std::string wstring_to_string(const std::wstring& in)
{
int len = WideCharToMultiByte(CP_UTF8, 0, in.c_str(), -1, 0, 0, 0, 0);
std::vector<char> buf(len);
WideCharToMultiByte(CP_UTF8, 0, in.c_str(), -1, &buf[0], len, 0, 0);
return std::string(buf.begin(), buf.end());
}
std::wstring string_to_wstring(const std::string& in)
{
int len = MultiByteToWideChar(CP_UTF8, 0, in.c_str(), -1, 0, 0);
std::vector<wchar_t> buf(len);
MultiByteToWideChar(CP_UTF8, 0, in.c_str(), -1, &buf[0], len);
return std::wstring(buf.begin(), buf.end());
}
答案 3 :(得分:1)
我不知道这样的图书馆,但我想指出你总是可以从一个到另一个,例如:
string s;
foo(s.c_str());
或
char *s;
foo(string(s));
请注意从wstring
到char*
或string
,因为您必须执行某些转换。
答案 4 :(得分:1)
如果您正在进行跨平台编码,则可以使用Qt4的QString / QByteArray。
答案 5 :(得分:1)
Boost String Algorithms Library可用于string和wstring上的许多文本操作。
答案 6 :(得分:1)