std :: wstring是否支持Windows上的UTF-16和UTF-32?

时间:2014-09-19 16:23:02

标签: c++ unicode utf-8 utf-16 utf-32

我正在学习Unicode并且有一些我希望得到解答的问题。

1)我在Linux上看过, std :: wstring 是4字节,而在Windows上,它是2字节。这是否意味着Linux内部支持 UTF-32 ,而Windows UTF-16

2)std :: wstring的使用是否与std :: string接口非常相似?

3)VC ++是否支持使用4字节的std :: wstring?

4)如果使用std :: wstring?

,是否必须更改编译器选项?

作为旁注,我遇到了一个用于处理UTF-8的字符串库,它具有与std :: string非常相似的接口,它提供熟悉的功能,如长度,子字符串,查找,大写/小写转换等。库是 Glib :: ustring

请随意添加任何评论或其他建议,因为我确实需要它。

谢谢!

2 个答案:

答案 0 :(得分:4)

  

1)我在Linux上看过,std :: wstring是4字节,而在Windows上,它是2字节。这是否意味着Linux内部支持是UTF-32而Windows是UTF-16?

实际上是wchar_t,而不是std::wstring,Linux上是4个字节,Windows上是2个字节。 std::wstringstd::basic_string<wchar_t>的typedef,因此std::wstring支持Linux上的UTF-32和Windows上的UTF-16,是的。

  

2)std :: wstring的使用是否与std :: string接口非常相似?

std::wstringstd::string都是std:basic_string的typedef,因此它们具有相同的界面,只有不同的value_type类型(wchar_t vs {{1}分别)。

  

3)VC ++是否支持使用4字节的std :: wstring?

不适用于char本身,不是。但您可以创建自己的std::wstring typedef,例如:

std::basic_string

实际上,这正是新C ++ 11 typedef std::basic_string<int32_t> u32string; std::u16string类型的定义方式:

std::u32string

typedef std::basic_string<char16_t> u16string; typedef std::basic_string<char32_t> u32string; 制作std::basic_string的typedef也并非闻所未闻:

TCHAR
  

作为旁注,我遇到了一个用于处理UTF-8的字符串库,它具有与std :: string非常相似的接口,它提供熟悉的功能,如长度,子字符串,查找,大写/小写转换等。库是Glib :: ustring。

从技术上讲,你可以(和许多人一样)使用标准typedef std::basic_string<TCHAR> tstring; 作为UTF-8。 std::string只是使用Glib::ustringgunichar的typedef而不是guint32)进一步使用它,并公开其接口以原始Unicode代码点而非编码代码单元运行

答案 1 :(得分:3)

1)wstringbasic_string<wchar_t>wchar_t的大小取决于实现,编码不可知(标准只是说“其值可以代表所有人的不同代码在支持的语言环境中指定的最大扩展字符集的成员。但是,是的,具有sizeof(wchar_t)=4字节的实现支持UTF-32,sizeof(wchar_t)=2字节支持UTF-16。

2)wstringbasic_string<wchar_t>stringbasic_string<char>,所以是的,它是一个非常相似的界面。您必须使用wcoutwcinwfstream,并且还有其他一些限制。

3)不,MSVC将wchar_t定义为unsigned short,正如您所说,它定义和限制wstring。 MSVC提供了将wchar_t作为typedef而不是内部类型进行处理的可能性。你可以想象然后重新定义typedef,但我怀疑这是极端冒险和邪恶。

4)不,您可以选择所需的字符串类型。

5)UTF-32和标准:有趣的是,在编码不可知的C ++标准中,仅对codecvt明确提及UTF-32:“专业化编码<char32_t, char, mbstate_t>之间的转换UTF-32和UTF-8编码形式.codecvt在窄字符和宽字符的本地字符集之间进行转换。“这表明char32_t将是UTF-32的可移植方法。不幸的是,MSVC还不支持这种类型。