04 Windows编程——Unicode
VS 2017下源码
1 #include<stdio.h> 2 3 int main() 4 { 5 char ASC_a = 'a'; 6 char *ASC_str = "hello"; 7 wchar_t W_a = 'a'; 8 wchar_t *W_str = "hello"; 9 printf("ASC_a = %c\n", ASC_a); 10 printf("sizeof(ASC_a) = %d\n", sizeof(ASC_a)); 11 printf("ASC_str = %s\n", ASC_str); 12 /* 打印ASC_a的内存 */ 13 printf("ASC_a = 0x%x\n", &ASC_a); 14 15 printf("W_a = %c\n", W_a); 16 printf("sizeof(W_a) = %d\n", sizeof(W_a)); 17 printf("W_str = %s\n", W_str); 18 /* 打印W_a的内存 */ 19 printf("W_a = 0x%x,0x%x\n", *((char*)&W_a), *(((char*)&W_a)+1)); 20 21 getchar(); 22 return 0; 23 }
运行结果
wchar_t *W_str = "hello";
对于宽字符串,如果使用printf("W_str = %s\n", W_str);可能不会打印出完整的字符串,而只显示第一个字符。
其原因是因为:宽字符占用2Byte,第二个字节就是\0。printf以为自己到头了,所以只打印一个字节。对printf使用%S参数,或者使用wprintf来避免这一问题。我手上的是VS 2017,使用printf("W_str = %s\n", W_str);居然也可以正常打印,其他版本的VS估计不行。
如果是其他版本的VS,可能需要在宽字符前面加L,打印宽字符串需要使用%S。这时候源码如下
1 #include<stdio.h> 2 3 int main() 4 { 5 char ASC_a = 'a'; 6 char *ASC_str = "hello"; 7 wchar_t W_a = L'a'; 8 wchar_t *W_str = L"hello"; 9 printf("ASC_a = %c\n", ASC_a); 10 printf("sizeof(ASC_a) = %d\n", sizeof(ASC_a)); 11 printf("ASC_str = %s\n", ASC_str); 12 /* 打印ASC_a的内存 */ 13 printf("ASC_a = 0x%x\n", &ASC_a); 14 15 printf("W_a = %c\n", W_a); 16 printf("sizeof(W_a) = %d\n", sizeof(W_a)); 17 printf("W_str = %S\n", W_str); 18 /* 打印W_a的内存 */ 19 printf("W_a = 0x%x,0x%x\n", *((char*)&W_a), *(((char*)&W_a)+1)); 20 21 getchar(); 22 return 0; 23 }
还可以使用TCHAR无脑处理Unicode ASCII。如果定义了_UNICODE,那么TCHAR = wchar_t,否则位char。如果定义了_UNICODE,那么_TEXT=L,否则_TEXT=空
1 #include<tchar.h> 2 3 int main() 4 { 5 TCHAR ASC_a = 'a'; 6 TCHAR *ASC_str = "hello"; 7 TCHAR W_a = L'a'; 8 TCHAR *W_str = L"hello"; 9 _tprintf(_TEXT("ASC_a = %c\n"), ASC_a); 10 _tprintf(_TEXT("sizeof(ASC_a) = %d\n"), sizeof(ASC_a)); 11 _tprintf(_TEXT("ASC_str = %s\n"), ASC_str); 12 /* 打印ASC_a的内存 */ 13 _tprintf(_TEXT("ASC_a = 0x%x\n"), &ASC_a); 14 15 _tprintf(_TEXT("W_a = %c\n"), W_a); 16 _tprintf(_TEXT("sizeof(W_a) = %d\n"), sizeof(W_a)); 17 _tprintf(_TEXT("W_str = %s\n"), W_str); 18 /* 打印W_a的内存 */ 19 _tprintf(_TEXT("W_a = 0x%x,0x%x\n"), *((char*)&W_a), *(((char*)&W_a)+1)); 20 21 _gettchar(); 22 return 0; 23 }
如果包含了Windows.h,就不用写_TEXT了,使用TEXT