windows程序开发中的Unicode和多字符
Ascii码与多字符
早期c语言使用的是Ascii码,也就是一个字节表示一个字符,8位可以表示256个不同的信息,所以可以表示256个字符,因扩展不同,ascii有几个版本,但是一个字节并不能表示很多其他的一些字符,所以使用了多字符集,也就是原本是ascii码的继续使用一个字节去表示,其他各个国家的语言文字及符号使用两个字节表示
例如下面的这个程序:
1 |
|
运行结果如图:
因为国字是以多字符存储存储的,但是单字节变量C只能存储一个字节的东西,这个时候会存储表示国字的多字符的后半个字节。所以会乱码!
鉴于多字符的不兼容性,所以发明出了Unicode
Unicode
Unicode是一种使用两个字节表示一个字符的编码,所以可以表示目前世界上的所有的字符。
使用Unicode的函数也不再是以前使用多字符集的那些函数了,二是对应的Unicode版(也就是现在所说的宽字符版)
宽字符版的字符类型:wchar_t
在给宽字符的字符变量和字符串变量赋值时要在前面加上L ,编译器才会将其识别并以unicode存储
并且使用宽字符版的打印函数的格式控制串前要加L此外打印宽字符的格式说明符不再是%c而是 %lc打印宽字符串的是%ls而不是%s**
下面是常见的字符处理函数对应的宽字符版:
printf(“格式化控制串”,参数列表) ———— wprintf(L”格式化控制串”,参数列表)
strlen(str) ———- wcslen(str)
sprintf(目标字符缓冲区,”格式化控制串”,参数列表)————swprintf(目标字符缓冲区,L”格式化控制字符串”,参数列表)
_snprintf(目标字符缓冲区,最大长度,”格式化控制串”,参数列表)———–_snwprintf(目标字符缓冲区,最大长度,L”格式化控制串”,参数列表)
参数数组的指针
vsprintf(存放格式化控制串的数组指针,参数数组的指针)——— _vsprintf(存放格式化控制串的数组指针,参数数组的指针)
下面的例子:
1 | int main(void) |
运行结果为:
windows通用版
鉴于使用ascii码时不能使用unicode,反之亦然,所以windows推出了通用版本的这些函数,和变量类型 TCHAR
详细的话看图,使用方法和我上面写的一样。
TCHAR.H这个头文件中包含了通用的函数和通用的字符类型
要补充的是通用版本的printf()为_tprintf(),使用时在控制字符串前加上_T()或者_TEXT()宏。然后在编译器的项目属性里面使用宽字符**即可,或者在源文件的最开头
加一句:
#define _UNICODE //定义了这个宏 可以使用通用版本的函数和_T()、__T()、_TEXT()宏
#define UNICODE //定义了这个宏,就可以使用通用的数据类型,和TEXT()宏
下面是一个使用windows版的小程序
1 | int main(void) |
执行结果: