2011-02-01 44 views
13

我知道所有关于std :: string和std :: wstring,但他们似乎没有完全关注UTF-8和UTF-16的扩展字符编码(至少在Windows上)。也不支持UTF-32。有没有正确处理Unicode的STL字符串类?

那么有谁知道跨平台的嵌入式替换类可以提供完整的UTF-8,UTF-16和UTF-32支持吗?

回答

9
用C

嘛++ 0x中存在着阶级的std :: u32string和std :: u16string。海湾合作委员会已经部分支持他们,所以你可以使用它们,但流支持unicode尚未完成Unicode support in C++0x

+0

嗯,我没有注意到,在新的标准。很有意思。非常遗憾,我不能在缺乏C++ 0x支持的编译器上使用它(例如iPhone编译器)。真正让我感到震惊的是,这些课程还不存在...... – Goz 2011-02-01 12:10:35

+0

有趣的是,GCC> 4.4和VS2010似乎都支持它。这是辉煌的。在涵盖windows,linux和Android移动平台的主要平台上。铿也表示,“很多”的例子工作... – Goz 2011-02-01 12:15:39

7

这不是STL,但如果你想在C++中使用正确的Unicode,那么你应该看看ICU

+0

看起来很有意思。可惜它没有STL字符串支持,尽管...在这种情况下它将是完美的...... – Goz 2011-02-01 11:37:01

+0

了解它,但是花了一些时间和DB2之后,在接触任何来自IBM的东西之前,我会考虑三次。你有没有使用它?好吗? – davka 2011-02-01 13:21:49

+1

@Goz:我完全同意,unicode足够“标准化”,我们可能希望这个字符串不仅仅是存储字节序列...... – 2011-02-01 13:21:50

3

在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; 
} 
+0

尽管它不是一个真正的sropin替换;)理想情况下,我希望看到像std :: string8,std :: string16和std :: string32 ... – Goz 2011-02-01 11:43:56

2

对于UTF-8支持,有Glib::ustring类。它是在std::string之后建模的,但是是utf-8知道的,例如。当你用迭代器扫描字符串时。它也有一些限制,例如迭代器总是const,因为替换字符可以改变字符串的长度,所以它可以使其他迭代器无效。

ustring不会自动将其他编码转换为utf-8,Glib库对此有各种conversion functions。你可以验证字符串是否是一个有效的utf-8。

而且还ustringstd::string是可以互换的,即ustring有投运营商的std :: string这样你就可以通过一个ustring为其中一个std::string预期参数,反之亦然当然,作为ustring可以构造从std::string

11

让我们不要忘记轻量级的,非常用户友好的只有标题的UTF-8库UTF8-CPP。不是替代品,但可以与std::string一起使用,并且没有外部依赖性。

2

Qt有QString在内部使用UTF-16,但有方法转换为或从std :: wstring,UTF-8,Latin1或区域设置编码转换。还有QTextCodec类可以将QStrings转换为基本上任何东西。但对于字符串使用Qt似乎对我来说太过分了。