qua*_*231 25 c string widechar
我在书中遇到过这个:
wscanf(L"%lf", &variable);
Run Code Online (Sandbox Code Playgroud)
其中第一个参数的类型为wchar_t *
.
这scanf("%lf", &variable);
与第一个参数的类型不同char *
.
那有什么不同呢?我之前从未听过"宽字符串".我听过一些名为Raw String Literals的东西,它正在打印字符串(不需要像转义序列那样的东西),但那不是在C.
Jer*_*fin 36
宽字符的确切性质是(有目的地)左实现定义.
当他们第一次发明这个概念时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,这(应该)使它们相对容易操作.然后在输出期间,它们再次转换为您选择的编码(这可能与您阅读的编码完全不同).
"宽字符串"指的是字符串中字符的编码.
来自维基百科:
宽字符是计算机字符数据类型,其大小通常大于传统的8位字符.增加的数据类型大小允许使用更大的编码字符集.
UTF-16是最常用的宽字符编码之一.
此外,wchar_t
由Microsoft定义为unsigned short(16-bit)
数据对象.这可能并且很可能是其他操作系统或语言中的不同定义.
摘自以下评论中的维基百科文章:
"wchar_t的宽度是特定于编译器的,可以小到8位.因此,需要可以在任何C或C++编译器上移植的程序不应使用wchar_t来存储Unicode文本.wchar_t类型用于存储编译器 - 定义了宽字符,在某些编译器中可能是Unicode字符."