c - C语言中的 "wide character string"是什么?

标签 c string widechar

我在书中看到了这个:

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/

相关文章:

c - C中有这样的语法吗? %[^\n]s

c++ - 字符串转换为 const char * 问题

c - 如何使用 JNI 打印宽字符

c - Mac OS X 上的原生 PNG 库 (mavericks)

c - 用C语言的定时器读取一个值

java - 声明字符串对象的混淆

c - 为什么 wcwidth 返回 -1 并带有我可以在终端上打印的标志?

c - C 中的欧拉项目 8

c - 如何确定源文件的编译顺序?

c++ - 没有空格的宏