4

我正在学习 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 非常相似的接口,它提供了熟悉的功能,例如长度、substr、查找、大写/小写转换等。该库是Glib ::ustring

请随时添加任何评论或其他建议,因为我真的需要它。

谢谢!

4

2 回答 2

4

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

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

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

std::wstring和都是std::string的类型定义std:basic_string,因此它们具有相同的接口,只是value_type类型不同(分别为wchar_tvs char)。

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

不为std::wstring自己,不。但是您可以创建自己的std::basic_stringtypedef,例如:

typedef std::basic_string<int32_t> u32string;

事实上,这正是新的 C++11std::u16stringstd::u32string类型的定义方式:

typedef std::basic_string<char16_t> u16string;
typedef std::basic_string<char32_t> u32string;

std::basic_string制作for的 typedef 也并非闻所未闻TCHAR

typedef std::basic_string<TCHAR> tstring;

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

从技术上讲,您可以(很多人也这样做)使用std::stringUTF-8 标准。 Glib::ustring只是通过使用gunichar(a typedef for guint32) 而不是更进一步char,并公开其接口以根据原始 Unicode 代码点而不是编码的代码单元进行操作。

于 2014-09-19T17:33:34.733 回答
4

1)wstring是 abasic_string<wchar_t>并且大小wchar_t取决于实现并且与编码无关(标准只是说“它的值可以代表支持的语言环境中指定的最大扩展字符集的所有成员的不同代码”。但是,是的,具有sizeof(wchar_t)=4bytes 支持 UTF-32,而sizeof(wchar_t)=2bytes 支持 UTF-16。

2) wstringis a basic_string<wchar_t>while stringis a basic_string<char>,所以是的,它是一个非常相似的接口。您将不得不使用wcout,wcin并且wfstream虽然还有其他一些类似的约束。

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

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

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

于 2014-09-19T16:35:51.140 回答