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

时间:2012-07-02 02:27:09

标签: c string widechar

我在书中看到了这个:

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

其中第一个参数的类型为wchar_t *

这与第一个参数类型为scanf("%lf", &variable);的{​​{1}}不同。

那有什么不同呢?我之前从未听过“宽字符串”。我听过一些名为Raw String Literals的东西,它正在打印字符串(不需要像转义序列这样的东西),但那不是在C中。

2 个答案:

答案 0 :(得分:35)

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

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

答案 1 :(得分:7)

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

来自Wikipedia

  

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

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

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

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

  

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