我在书中遇到了这个:
wscanf(L"%lf", &variable);
其中第一个参数的类型为wchar_t *
.
这与scanf("%lf", &variable);
第一个参数的类型不同char *
。
那么有什么区别呢。我以前从未听说过“宽字符串”。我听说过一种叫做 Raw String Literals 的东西,它按原样打印字符串(不需要转义序列之类的东西),但这不在 C 语言中。
宽字符的确切性质是(有目的地)左实现定义的。
当他们第一次发明wchar_t
. 他们没有尝试规定国际字符将是一个或另一个(或可能完全是其他东西),而是提供了一种类型(和一些函数),实现可以定义该类型以支持他们选择的国际字符集。
不同的实现已经发挥了变化的潜力。例如,如果您在 Windows 上使用 Microsoft 的编译器,wchar_t
将是一个 16 位类型,持有 UTF-16 Unicode(最初它持有 UCS-2 Unicode,但现在已正式过时)。
在 Linux 上,wchar_t
通常是 32 位类型,持有 UCS-4/UTF-32 编码的 Unicode。gcc 到至少一些其他操作系统的端口也是如此,尽管我从未尝试确认它总是如此。
但是,不能保证这一点。至少在理论上,Linux 上的实现可以使用 16 位,或者 Windows 上的实现可以使用 32 位,或者任何一个都可以决定使用 64 位(尽管在现实中看到这一点我会有点惊讶)。
在任何情况下,关于事物如何工作的一般想法是,单个wchar_t
就足以表示一个代码点。对于 I/O,数据旨在从外部表示(无论它是什么)转换为wchar_t
s,这(应该)使它们相对容易操作。然后在输出期间,它们再次转换为您选择的编码(可能与您读取的编码完全不同)。
“宽字符串”是指字符串中字符的编码。
来自维基百科:
宽字符是一种计算机字符数据类型,其大小通常大于传统的 8 位字符。增加的数据类型大小允许使用更大的编码字符集。
UTF-16是最常用的宽字符编码之一。
此外,Microsoftwchar_t
将其定义为数据对象。这可能并且很可能是其他操作系统或语言中的不同定义。unsigned short(16-bit)
摘自以下评论的维基百科文章:
“wchar_t 的宽度是特定于编译器的,可以小至 8 位。因此,需要在任何 C 或 C++ 编译器之间移植的程序不应使用 wchar_t 来存储 Unicode 文本。wchar_t 类型用于存储编译器 -定义的宽字符,在某些编译器中可能是 Unicode 字符。”