"UTF-16"和"std::wstring"有什么区别?

12

这两种字符串存储格式有什么区别吗?


1
这个问题在这里有一个非常好的答案:https://dev59.com/kHRC5IYBdhLWcg3wG9bp#402918 - Idan K
3个回答

17

std::wstring 是一个以 wchar_t 为元素的容器。 wchar_t 的大小没有被指定——Windows 编译器倾向于使用 16 位类型,Unix 编译器则使用 32 位类型。

UTF-16 是一种将 Unicode 码点序列编码为 16 位整数序列的方式。

如果您在 Visual Studio 中使用宽字符字面值(例如 L"Hello World"),并且该字面值不包含 BMP 之外的字符,则会得到 UTF-16,但是这两个概念大部分情况下是无关的。如果使用 BMP 之外的字符,则即使 wchar_t 是 16 位,std::wstring 也不会为您将 代理对 转换为 Unicode 码点。


你的意思是在Windows操作系统中,std::wstring仅对非BMP Unicode字符与UTF-16相同吗? - hkBattousai
8
std::wstring仅仅是一个整数的容器。容器内部所包含的编码完全取决于你向其中插入的数据内容。 - JoeG
1
+1:对于不熟悉UTF的人来说,定义BMP可能是明智的。 - Martin York
1
你的最后一段回答了我的问题。谢谢。 - hkBattousai

9

UTF-16是一种特定的Unicode编码方式。 std::wstring 是一种字符串实现,它使用 wchar_t 作为存储每个字符的基础类型。相比之下,普通的 std::string 使用 char

wchar_t一起使用的编码不一定是UTF-16,例如它也可以是UTF-32。


3
它也可以是UCS-2、S-JIS、Big 5或其他任何编码格式。 - greyfade

3

UTF-16 是一种用16位元素表示文本的概念,但一个实际的文本字符可能由多个元素组成。

std::wstring 只是这些元素的集合,它是一个主要关注存储的类。

wstring 中的元素 wchar_t 至少为16位,但也可能是32位。


你能否详细解释一下,例如给出一个例子。比如字符'A'存储在std::wstring中为"0x0041",那么它在UTF-16格式中是如何存储的? - hkBattousai
7
16-字节?哇,那是一种强硬的字符编码方式。 - Inverse
2
@Inverse:这就是为什么每个人都应该只使用ASCII,这样在内存使用方面就不会有太多的烦恼了 ;) - Matthieu M.
1
对于那些可能不理解上述评论中的幽默的人来说,UTF-16是一种16位的Unicode编码。此外,在UTF-16中,使用多个16位元素定义的字符是通过代理对来实现的。 - DavidRR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接