windows程序开发中Unicode和多字符

windows程序开发中的Unicode和多字符

Ascii码与多字符

早期c语言使用的是Ascii码,也就是一个字节表示一个字符,8位可以表示256个不同的信息,所以可以表示256个字符,因扩展不同,ascii有几个版本,但是一个字节并不能表示很多其他的一些字符,所以使用了多字符集,也就是原本是ascii码的继续使用一个字节去表示,其他各个国家的语言文字及符号使用两个字节表示

例如下面的这个程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

int main(void)

{

char c = '国';

char str[] = "中国";

int i;

i = strlen(str);

printf("%c\n", c);

printf("%s\n", str);

printf("长度:%d\n", i);

return 0;

}

运行结果如图:

因为国字是以多字符存储存储的,但是单字节变量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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main(void)

{

wchar_t c = L'国';

wchar_t str[] = L"玩re的小明";

int i;

i = wcslen(str);

setlocale(LC_ALL, "chs"); //设置语言为中文

wprintf(L"%lc\n", c);

wprintf(L"打印字符串:%ls\n", str);

wprintf(L"字符串长度:%d\n", i);

return 0;

}

运行结果为:

windows通用版

鉴于使用ascii码时不能使用unicode,反之亦然,所以windows推出了通用版本的这些函数,和变量类型 TCHAR

详细的话看图,使用方法和我上面写的一样。

TCHAR.H这个头文件中包含了通用的函数和通用的字符类型

要补充的是通用版本的printf()为_tprintf(),使用时在控制字符串前加上_T()或者_TEXT()宏。然后在编译器的项目属性里面使用宽字符**即可,或者在源文件的最开头
加一句:

#define _UNICODE //定义了这个宏 可以使用通用版本的函数和_T()、__T()、_TEXT()宏

#define UNICODE //定义了这个宏,就可以使用通用的数据类型,和TEXT()宏
下面是一个使用windows版的小程序

1
2
3
4
5
6
7
8
9
10
11
12
13
int main(void)



TCHAR str[]=_T("玩re的小明");

setlocale(LC_ALL, "chs"); //设置语言为中文

_tprintf(_T("%ls"),str);

return 0;

}

执行结果: