我正在学习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 。
请随意添加任何评论或其他建议,因为我确实需要它。
谢谢!
答案 0 :(得分:4)
1)我在Linux上看过,std :: wstring是4字节,而在Windows上,它是2字节。这是否意味着Linux内部支持是UTF-32而Windows是UTF-16?
实际上是wchar_t
,而不是std::wstring
,Linux上是4个字节,Windows上是2个字节。 std::wstring
是std::basic_string<wchar_t>
的typedef,因此std::wstring
支持Linux上的UTF-32和Windows上的UTF-16,是的。
2)std :: wstring的使用是否与std :: string接口非常相似?
std::wstring
和std::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::ustring
(gunichar
的typedef而不是guint32
)进一步使用它,并公开其接口以原始Unicode代码点而非编码代码单元运行
答案 1 :(得分:3)
1)wstring
是basic_string<wchar_t>
,wchar_t
的大小取决于实现,编码不可知(标准只是说“其值可以代表所有人的不同代码在支持的语言环境中指定的最大扩展字符集的成员。但是,是的,具有sizeof(wchar_t)=4
字节的实现支持UTF-32,sizeof(wchar_t)=2
字节支持UTF-16。
2)wstring
是basic_string<wchar_t>
而string
是basic_string<char>
,所以是的,它是一个非常相似的界面。您必须使用wcout
,wcin
和wfstream
,并且还有其他一些限制。
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还不支持这种类型。