用于C ++字符串的通用库

时间:2010-12-20 14:08:56

标签: c++ string unicode ascii

请推荐我用于C ++字符串的通用库。我想在一个构建中操作ascii文本和unicode文本,而不为std :: string / char和std :: wstring / wchar创建两个版本的构建;我也希望将它们转换为彼此(可能的地方);

非常感谢!!!

7 个答案:

答案 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提供WideCharToMultiByteMultiByteToWideChar来完成这些类型的转换。

答案 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));

请注意从wstringchar*string,因为您必须执行某些转换。

答案 4 :(得分:1)

如果您正在进行跨平台编码,则可以使用Qt4的QString / QByteArray

答案 5 :(得分:1)

Boost String Algorithms Library可用于string和wstring上的许多文本操作。

答案 6 :(得分:1)

在Java和Objective-C(和C#?)中,策略是在内部将所有内容编码为UTF-16,并在从外部实体(例如文件,UI)获取字符串或向其发送字符串时使用转换。为了理智,你应该做同样的事情。在内部保存所有内容为UTF-16(每个字符需要16位)。使用字符串库在UTF-16和外部表示之间进行转换。在C中,我可以想到三个我的头顶

在C ++中,我不知道任何库。您的操作系统平台也可能包含自己的库来进行转换。

除非你知道你将永远处理直接ASCII或ISO-8859-1,否则你应该总是使用库来进行转换,而不是自己编辑,因为问题很多且各不相同。