C语言中的“宽字符串”是啥?

Posted

技术标签:

【中文标题】C语言中的“宽字符串”是啥?【英文标题】:What is a "wide character string" in C language?C语言中的“宽字符串”是什么? 【发布时间】:2012-07-02 11:39:54 【问题描述】:

我在书中看到了这个:

wscanf(L"%lf", &variable);

第一个参数的类型为wchar_t *

这与scanf("%lf", &variable); 不同,其中第一个参数的类型为char *

那么有什么区别呢。我以前从未听说过“宽字符串”。我听说过一种叫做 Raw String Literals 的东西,它按原样打印字符串(不需要转义序列之类的东西),但这不是 C 语言。

【问题讨论】:

从这里开始joelonsoftware.com/articles/Unicode.html 第一个参数实际上是wchar_t []类型,与wchar_t *略有不同。 【参考方案1】:

宽字符的确切性质是(有目的地)左实现定义的。

当他们第一次发明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_ts,这(应该)使它们相对容易操作。然后在输出过程中,它们再次转换为您选择的编码(可能与您读取的编码完全不同)。

【讨论】:

其他非linux unix呢?另外,这不是 glibc 而不是 linux 的属性吗? 正如我所说,不,不能保证:“理论上,Linux 上的实现可以使用 16 位”。就非 Linux Unix 而言,我最近还没有足够聪明地发表评论。【参考方案2】:

“宽字符串”是指字符串中字符的编码。

来自Wikipedia:

宽字符是一种计算机字符数据类型,通常具有 大小大于传统的 8 位字符。增加的 数据类型大小允许使用更大的编码字符集。

UTF-16 是最常用的宽字符编码之一。

此外,wchar_t 由Microsoft 定义为unsigned short(16-bit) 数据对象。这可能并且很可能是其他操作系统或语言中的不同定义。

摘自以下评论中的***文章:

"wchar_t 的宽度是编译器特定的,可以小到 8 位。因此,需要跨任何 C 或 C++ 编译器不应该使用 wchar_t 来存储 Unicode 文本。这 wchar_t 类型用于存储编译器定义的宽字符, 在某些编译器中可能是 Unicode 字符。”

【讨论】:

根据***,它不可移植:en.wikipedia.org/wiki/Wide_character @quantum231,wiki 的答案实际上只适用于 MSFT。阅读 Jerry 的回答和 Joel 博客文章

以上是关于C语言中的“宽字符串”是啥?的主要内容,如果未能解决你的问题,请参考以下文章

C语言 sscanf用法详解

Long 指向常量宽字符串的指针,这里的 Long 的作用是啥?

在C(GCC)中的宽字符串上调用goto

wcschr (Strings) – C 中文开发手册

c语言中的strcpy是啥意思?

c != '\n' 条件在“for”循环(C 语言)中的作用是啥?