我在书中看到了这个:
wscanf(L"%lf", &variable);
第一个参数的类型是wchar_t *
。
这与 scanf("%lf", &variable);
不同,后者的第一个参数是 char *
类型。
那么和.有什么区别呢。我以前从未听说过“宽字符串”。我听说过一种叫做 Raw String Literals 的东西,它按原样打印字符串(不需要转义序列之类的东西),但这不是在 C 中。
最佳答案
宽字符的确切性质(有目的地)留给实现定义。
当他们第一次发明 wchar_t
的概念时,ISO 10646 和 Unicode 仍在相互竞争(而现在,他们大多是合作的)。他们并没有试图规定国际字符是其中之一(或者可能完全是其他字符),而是提供了一种类型(和一些函数),实现可以定义这些类型以支持他们选择的国际字符集。
不同的实现已经发挥了变化的潜力。例如,如果您在 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
,这(应该)使它们相对容易操作。然后在输出期间,它们再次转换为您选择的编码(这可能与您读取的编码完全不同)。
关于c - C语言中的 "wide character string"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11287213/