- 微软编译器(内嵌于visual studio)采用UTF-16编码存储字符,使用两个字节存储一个字符;
- 字符保存后都是以整数保存的,所以用unsigned short存储中文字符比较合适,unsigned short类型恰好是两个字节的长度。
- 而GCC、LLVM/Clang编译器采用UTF-32编码,使用4个字节存储一个字符,那么我们就需要以unsigned int类型来存储。
- 为了解决不同编译器下不同编码导致的存储字符时采取的不同整数类型的问题,微软提出了wchar_t类型,全称即wide character type。其自动适应各编译器编码,自动转换为unsigned int或unsigned short类型。
- wchar_t类型位于<wchar.h>头文件中,它使得代码具有良好的移值性,以后我们用其来存储宽字符(什么叫宽字符,即存储时需要大于传统8位整数来存储的字符)。
- 要想使用宽字符的编码方式,需要加上L前缀,加上L前缀后,字符将变为宽字符;不加L前缀,默认ASCII编码。宽字符采用UTF-16或UTF-32编码保存,窄字符用ASCII编码保存,如下:
wchar_t a = L'A';
wchar_t b = L'9';
wchar_t c = L'中';
wchar_t d = L'国';
// 宽字符的输出
putchar和printf函数只能输出不加L前缀的窄字符,不能输出宽字符;
<wchar.h>中的putwchar和wprintf函数用于输出宽字符;
wprintf函数输出宽字符的格式控制符为%lc;
并且在输出宽字符之前还需要使用setlocate函数进行本地化设置,关于中文输出,参考链接:http://c.biancheng.net/view/vip_1767.html
// 宽字符串的输出
参考链接:http://c.biancheng.net/view/vip_1767.html
-
不加L前缀的窄字符串也可以处理中文!
-
在C语言中,只有char类型的窄字符存储时使用ASCII编码保存,wchar_t类型的宽字符和宽字符串使用UTF-16编码或者UTF-32编码保存,而char类型的窄字符串跟具体没有规定哪一种编码,这个和操作系统以及编译器有关,但是可以肯定的是,当代计算机不再以ASCII编码来存储窄字符串了,因为ASCII只能显示英文和数字等字符,不支持中文,而我们的prinf()和puts()函数是可以打印中文字符串的!!!
-
窄字符串相关的保存编码参考链接:
http://c.biancheng.net/view/vip_1768.html
- 今日总结:
# 字符存储编码总结:
对于char类型的窄字符,采用ASCII编码;
对于wchar_t类型的宽字符,采用UTF-16或者UTF-32编码;
对于char类型的窄字符串,微软VISUAL STUDIO使用本地编码,GCC、LLVM/Clang使用和源文件编码相同的编码;
# 另外,处理窄字符和处理宽字符使用的函数也不一样
<stdio.h>中的putchar、puts、printf函数用来处理窄字符;
<wchar.h>中的putwchar、wprintf函数用来处理宽字符;
- 今天算是学到了一些东西,解答了一些之前的疑惑!!!不错不错哈哈哈哈哈!
- 这下更坚定了我学习下去的决心:C语言基础搞定之后 -> 进阶C语言如何管理内存!!!!
书签
http://c.biancheng.net/view/1769.html