为什么要有wchar_t?那还不是为了跟上Unicode的步伐,解决字符编码混乱的问题,毕竟char已经被代码页搞得一团糟了,而wchar_t就是全村的希望。
UCS-2扩展成UCS-4之后,wchar_t就需要4个字节才能存下这么多字符了,但是微软表示:不,wchar_t在Windows上就是2字节,谁也不能改。
人家微软也是有理由的,我Windows NT好不容易从ANSI全面转向Unicode,系统API都把Unicode当作默认选项了,现在突然变成4字节,兼容性还要不要了?系统出了问题谁负责?
于是wchar_t在Windows上就一直是2字节了。
实际上微软已经算好的了,后来好歹是把wchar_t从UCS-2升级成了UTF-16,否则还不知道会出多少乱子。
其他制造商可就没有微软这么“良心”了,比如IBM的某些设备上wchar_t既不是UTF-16也不是UTF-32,而是和char一样的本地环境编码,只不过大小是2字节;还有些实现更懒,直接不支持额外的本地环境,wchar_t也是1字节。
你可能会说:“啊?”
其实没什么好惊讶的,看看C99对wchar_t的描述,它既没有要求这玩意儿是Unicode也没有要求这玩意儿至少有2字节,一切都取决于实现,那实现自然是怎么高兴怎么来啊。
wchar_t就这么成为了第二个char。
可是我们要wchar_t本来不就是希望你能像Unicode一样解决字符编码不统一的问题?现在你自己都不统一了,我要你有什么用?
你甚至连大小都不能确定呢,那我直接用char不是更香,人家好歹能确定是一个字节呢。
相比之下做得最好的要数Linux了,在今天常见的Linux发行版上,char通常是UTF-8编码,而wchar_t通常是4字节的UTF-32,可谓是清晰简洁明了。