UTF-8可以用1、2或4个字节进行编码。在我的系统上,一个char
占用1个字节。我应该使用wchar_t
作为预防措施,以便能够容纳任意的UTF-8编码字符吗?
不,你不应该这样做!Unicode 4.0标准(ISO 10646:2003)指出:
wchar_t
的宽度是与编译器相关的,可以小至8位。因此,需要在任何C或C++编译器之间可移植的程序不应使用wchar_t
来存储Unicode文本。
在大多数情况下,UTF-8文本的“字符性质”对于您的程序并不重要,因此将其视为char
元素的数组,就像任何其他字符串一样,就足够了。但是,如果您需要提取单个字符,则这些字符应存储在至少24位宽的类型中(例如uint32_t
),以容纳所有Unicode代码点。
wchar_t
不太适合用于编写可移植代码。
在维基百科上:
wchar_t
的宽度取决于编译器,可以小至8位。因此,需要跨任何C或C++编译器进行可移植的程序不应使用wchar_t
来存储Unicode文本。wchar_t
类型旨在存储编译器定义的宽字符,在某些编译器中可能是Unicode字符。
此外,
C和C ++在2011年各自的标准修订版中引入了固定大小的字符类型char16_t
和char32_t
,以提供对16位和32位Unicode转换格式的明确表示,将wchar_t
留给实现定义。
wchar_t
通常是2个字节,而不是4个字节。 - Yakk - Adam Nevraumont