我知道所有关于std :: string和std :: wstring,但他们似乎没有完全关注UTF-8和UTF-16的扩展字符编码(至少在Windows上)。也不支持UTF-32。有没有正确处理Unicode的STL字符串类?
那么有谁知道跨平台的嵌入式替换类可以提供完整的UTF-8,UTF-16和UTF-32支持吗?
我知道所有关于std :: string和std :: wstring,但他们似乎没有完全关注UTF-8和UTF-16的扩展字符编码(至少在Windows上)。也不支持UTF-32。有没有正确处理Unicode的STL字符串类?
那么有谁知道跨平台的嵌入式替换类可以提供完整的UTF-8,UTF-16和UTF-32支持吗?
嘛++ 0x中存在着阶级的std :: u32string和std :: u16string。海湾合作委员会已经部分支持他们,所以你可以使用它们,但流支持unicode尚未完成Unicode support in C++0x。
在STL上不支持UTF-8。作为替代方案可以优尔使用boost codecvt:
//...
// My encoding type
typedef wchar_t ucs4_t;
std::locale old_locale;
std::locale utf8_locale(old_locale,new utf8_codecvt_facet<ucs4_t>);
// Set a New global locale
std::locale::global(utf8_locale);
// Send the UCS-4 data out, converting to UTF-8
{
std::wstringstream oss;
oss.imbue(utf8_locale);
std::copy(ucs4_data.begin(),ucs4_data.end(),
std::ostream_iterator<ucs4_t,ucs4_t>(oss));
std::wcout << oss.str() << std::endl;
}
尽管它不是一个真正的sropin替换;)理想情况下,我希望看到像std :: string8,std :: string16和std :: string32 ... – Goz 2011-02-01 11:43:56
对于UTF-8支持,有Glib::ustring类。它是在std::string
之后建模的,但是是utf-8知道的,例如。当你用迭代器扫描字符串时。它也有一些限制,例如迭代器总是const
,因为替换字符可以改变字符串的长度,所以它可以使其他迭代器无效。
ustring
不会自动将其他编码转换为utf-8,Glib
库对此有各种conversion functions。你可以验证字符串是否是一个有效的utf-8。
而且还ustring
和std::string
是可以互换的,即ustring
有投运营商的std :: string这样你就可以通过一个ustring
为其中一个std::string
预期参数,反之亦然当然,作为ustring
可以构造从std::string
。
让我们不要忘记轻量级的,非常用户友好的只有标题的UTF-8库UTF8-CPP。不是替代品,但可以与std::string
一起使用,并且没有外部依赖性。
Qt有QString在内部使用UTF-16,但有方法转换为或从std :: wstring,UTF-8,Latin1或区域设置编码转换。还有QTextCodec类可以将QStrings转换为基本上任何东西。但对于字符串使用Qt似乎对我来说太过分了。
也看看http://grigory.info/UTF8Strings.About.html它是UTF8原生。
嗯,我没有注意到,在新的标准。很有意思。非常遗憾,我不能在缺乏C++ 0x支持的编译器上使用它(例如iPhone编译器)。真正让我感到震惊的是,这些课程还不存在...... – Goz 2011-02-01 12:10:35
有趣的是,GCC> 4.4和VS2010似乎都支持它。这是辉煌的。在涵盖windows,linux和Android移动平台的主要平台上。铿也表示,“很多”的例子工作... – Goz 2011-02-01 12:15:39