std::wstring 在 Windows 上支持 UTF-16 和 UTF-32 吗?

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

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

谢谢你!

Rem*_*eau 7

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

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

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

和都是 typedef std::wstring,因此它们具有相同的接口,只是类型不同(分别为vs )。std::stringstd:basic_stringvalue_typewchar_tchar

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

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

typedef std::basic_string<int32_t> u32string;
Run Code Online (Sandbox Code Playgroud)

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

typedef std::basic_string<char16_t> u16string;
typedef std::basic_string<char32_t> u32string;
Run Code Online (Sandbox Code Playgroud)

std::basic_string对for进行 typedef 也并非闻所未闻TCHAR

typedef std::basic_string<TCHAR> tstring;
Run Code Online (Sandbox Code Playgroud)

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

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


Chr*_*phe 5

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

2)wstring是 abasic_string<wchar_t>string是 a basic_string<char>,所以是的,这是一个非常相似的接口。您将不得不使用wcout,wcinwfstream,并且还有一些其他类似的约束。

3)不,MSVC定义wchar_tunsigned Short,它定义和限制wstring如你所说。wchar_tMSVC 提供了作为 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 还不支持这种类型。