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_t
s,这(应该)使它们相对容易操作。然后在输出过程中,它们再次转换为您选择的编码(可能与您读取的编码完全不同)。
【讨论】:
其他非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语言中的“宽字符串”是啥?的主要内容,如果未能解决你的问题,请参考以下文章