使用像 wchar_t 这样的类型有什么意义?
What is the sense of using types like wchar_t?
我查看了一些答案和文章,其中指出 wchar_t
用于存储编码为 utf-16
的 unicode 符号。这是有道理的,但是...
变量内容不取决于它的处理方式或格式吗?我们可以获取一个 int
变量并将其格式化为一个字符。我们可以将同样长 2 个字节的 short
也格式化为一个字符,从而获得相同的 2 个字节字符。至少根据我的经验,这从未引起任何错误。此外,据我所知,编译器可能确实将字符视为 int
类型。
为什么会存在 wchar_t
或 char16_t
这样的类型?不能使用像 short
这样的类型吗?这只是一个惯例,还是 wchar_t
和 short
的工作方式确实不同?
不保证 wchar_t 的大小跨平台。在 Linux 中,wchar_t 是 4 个字节,但在 Windows 或 AIX 中是 2 个字节。这就是数据类型被抽象出来的原因,它留作平台实现细节。创建宽字符是为了支持 multi-byte 字符,但在此之前存在平台支持的 Unicode 实现。此外,宽字符的编码也可能因平台而异。
short
类型的大小是 platform-dependent。因此,如果您需要使用恰好 16 位的整数,您可以使用 int16_t
或 uint16_t
类型。
使用类型 wchar_t
使代码独立于 wchar_t
的基础类型(即 platform-dependent)。例如,使用类型 wchar_t
的函数可以声明为同样独立于类型 wchar_t
.
的基础整数类型
C 标准将类型 wchar_t
定义为整数类型。
wchar_t
which is an integer type whose range of values can represent distinct
codes for all members of the largest extended character set specified
among the supported locales;
通常类型 wchar_t
被定义为类型 uint16_t
或 uint32_t
的别名,称为 wchar_t
的基础类型。
What is the sense of using types like wchar_t?
代表特定平台上的宽字符。
Why do types like wchar_t or char16_t even exist?
为什么存在任何类型 - 我们可以对所有内容使用 long long
?为什么会有C语言?为程序员提供对机器的抽象。 C 编程语言中的不同类型作为对 machine/platform 特定类型的抽象存在,因此不同的 C 编译器可能会根据平台将相同的代码编译为不同的机器指令。使用 wchar_t
的相同代码可以针对 windows 和 linux 进行编译,并创建具有相同功能的不同可执行文件。存在不同的类型来抽象不同的事物——short
代表一个短数字,一个 wchar_t
代表一个宽字符。这些抽象是为了让编译器可以自由地在机器代码中表示这些语义,并允许程序员编写可读代码。
Cannot types like short be used instead?
在 short
可以表示 wchar_t
可以表示的所有值的平台上,然后 short
可以用来存储宽字符值。无论如何都不能保证这一点。简单来说,wchar_t
可能比 short
有更多字节。可能存在不能用 short
类型表示的宽字符。还有对齐要求。 char16_t
.
类似
char16_t
和uint_least16_t
是同一个类型,你可以用它代替。当然标准可以使用精确的 16 位变量,但是使用 16 位寄存器的操作在特定机器上可能慢得离谱。所以标准给了编译器自由——选择他想要的类型。
Is it just a convention, or wchar_t and short work differently indeed?
可以说,整个C语言只是一种约定俗成。创建一个约定,给其他人一些抽象的东西 from/to 和参考。标准化约定为可移植性奠定了基础。可移植性是指您可以为一个平台编写代码并 运行 无需担心地在另一个平台上编写代码。您可以在特定平台上使用short
而不是wchar_t
,但是您的代码在其他平台上会出人意料地失败。
wchar_t
旨在用作一般的“宽”字符类型,而不是专门的 UTF-16:
7.19 Common definitions <stddef.h>
...
2 The types are
...
wchar_t
which is an integer type whose range of values can represent distinct codes for all
members of the largest extended character set specified among the supported locales; the
null character shall have the code value zero. Each member of the basic character set
shall have a code value equal to its value when used as the lone character in an integer
character constant if an implementation does not define
_ _STDC_MB_MIGHT_NEQ_WC_ _
.
C 2011 Online Draft
添加了重点。
支持的最大扩展字符集包含的不同值的数量可能大于当前平台的 short
可以表示的数量;它可能要小得多。 wchar_t
将为此调整大小。
不要根据类型占用的字节数来考虑类型 - C 语言定义当然不会。它根据 必须能够表示的值的最小范围 来定义各种类型。一个 short
必须能够表示 至少 范围 [-32767..32767]
中的所有值,这意味着该类型必须包含 至少 16 个值位,但它可能更宽。
在大多数现代真实机器上,本机字大小为 32 或 64 位,所有内容都分解为 8 位字节,但这既不是必需的,也不是保证的。
C 中的 matter 类型,wchar_t
和 short
表示不同的事物并暗示不同的行为。
我查看了一些答案和文章,其中指出 wchar_t
用于存储编码为 utf-16
的 unicode 符号。这是有道理的,但是...
变量内容不取决于它的处理方式或格式吗?我们可以获取一个 int
变量并将其格式化为一个字符。我们可以将同样长 2 个字节的 short
也格式化为一个字符,从而获得相同的 2 个字节字符。至少根据我的经验,这从未引起任何错误。此外,据我所知,编译器可能确实将字符视为 int
类型。
为什么会存在 wchar_t
或 char16_t
这样的类型?不能使用像 short
这样的类型吗?这只是一个惯例,还是 wchar_t
和 short
的工作方式确实不同?
不保证 wchar_t 的大小跨平台。在 Linux 中,wchar_t 是 4 个字节,但在 Windows 或 AIX 中是 2 个字节。这就是数据类型被抽象出来的原因,它留作平台实现细节。创建宽字符是为了支持 multi-byte 字符,但在此之前存在平台支持的 Unicode 实现。此外,宽字符的编码也可能因平台而异。
short
类型的大小是 platform-dependent。因此,如果您需要使用恰好 16 位的整数,您可以使用 int16_t
或 uint16_t
类型。
使用类型 wchar_t
使代码独立于 wchar_t
的基础类型(即 platform-dependent)。例如,使用类型 wchar_t
的函数可以声明为同样独立于类型 wchar_t
.
C 标准将类型 wchar_t
定义为整数类型。
wchar_t
which is an integer type whose range of values can represent distinct codes for all members of the largest extended character set specified among the supported locales;
通常类型 wchar_t
被定义为类型 uint16_t
或 uint32_t
的别名,称为 wchar_t
的基础类型。
What is the sense of using types like wchar_t?
代表特定平台上的宽字符。
Why do types like wchar_t or char16_t even exist?
为什么存在任何类型 - 我们可以对所有内容使用 long long
?为什么会有C语言?为程序员提供对机器的抽象。 C 编程语言中的不同类型作为对 machine/platform 特定类型的抽象存在,因此不同的 C 编译器可能会根据平台将相同的代码编译为不同的机器指令。使用 wchar_t
的相同代码可以针对 windows 和 linux 进行编译,并创建具有相同功能的不同可执行文件。存在不同的类型来抽象不同的事物——short
代表一个短数字,一个 wchar_t
代表一个宽字符。这些抽象是为了让编译器可以自由地在机器代码中表示这些语义,并允许程序员编写可读代码。
Cannot types like short be used instead?
在 short
可以表示 wchar_t
可以表示的所有值的平台上,然后 short
可以用来存储宽字符值。无论如何都不能保证这一点。简单来说,wchar_t
可能比 short
有更多字节。可能存在不能用 short
类型表示的宽字符。还有对齐要求。 char16_t
.
char16_t
和uint_least16_t
是同一个类型,你可以用它代替。当然标准可以使用精确的 16 位变量,但是使用 16 位寄存器的操作在特定机器上可能慢得离谱。所以标准给了编译器自由——选择他想要的类型。
Is it just a convention, or wchar_t and short work differently indeed?
可以说,整个C语言只是一种约定俗成。创建一个约定,给其他人一些抽象的东西 from/to 和参考。标准化约定为可移植性奠定了基础。可移植性是指您可以为一个平台编写代码并 运行 无需担心地在另一个平台上编写代码。您可以在特定平台上使用short
而不是wchar_t
,但是您的代码在其他平台上会出人意料地失败。
wchar_t
旨在用作一般的“宽”字符类型,而不是专门的 UTF-16:
7.19 Common definitionsC 2011 Online Draft<stddef.h>
...
2 The types are
...
wchar_t
which is an integer type whose range of values can represent distinct codes for all members of the largest extended character set specified among the supported locales; the null character shall have the code value zero. Each member of the basic character set shall have a code value equal to its value when used as the lone character in an integer character constant if an implementation does not define_ _STDC_MB_MIGHT_NEQ_WC_ _
.
添加了重点。
支持的最大扩展字符集包含的不同值的数量可能大于当前平台的 short
可以表示的数量;它可能要小得多。 wchar_t
将为此调整大小。
不要根据类型占用的字节数来考虑类型 - C 语言定义当然不会。它根据 必须能够表示的值的最小范围 来定义各种类型。一个 short
必须能够表示 至少 范围 [-32767..32767]
中的所有值,这意味着该类型必须包含 至少 16 个值位,但它可能更宽。
在大多数现代真实机器上,本机字大小为 32 或 64 位,所有内容都分解为 8 位字节,但这既不是必需的,也不是保证的。
C 中的 matter 类型,wchar_t
和 short
表示不同的事物并暗示不同的行为。