【问题标题】: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 语言。

【问题讨论】:

标签: c string widechar


【解决方案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_tMicrosoft 定义为unsigned short(16-bit) 数据对象。这可能并且很可能是其他操作系统或语言中的不同定义。

摘自以下评论中的维基百科文章:

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

【讨论】:

猜你喜欢
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多