在Windows C程序中使用Unicode编码

一、Unicode字符/字符串使用L前缀

在windows的C/C++项目中,如果要使用Unicode编码,则必须在字符串或字符前加上’L’前缀,Unicode字符串以两个0结尾\0\0。如果不加L前缀,则表示使用默认的扩展ASCII编码(在中国大陆应该就是GB2312)

#include <locale.h>

int main()
{
	setlocale(LC_ALL, ""); // 设置地域,第二个参数字符串为空表示使用当前操作系统的地域

	char s1[] = "中A国"; // 使用多字节字符集(gb2312)
	wchar_t s2[] = L"中A国"; // 使用unicode字符集
	
	printf("%s\n", s1);	
	wprintf(L"%s\n", s2); // 必须setlocale告诉控制台使用Unicode编码显示
	
	return 0;
}

在这里插入图片描述

二、Unicode版本的字符串函数

宽字符有一套专门的函数。

#include <locale.h>
#include <string.h>
int main()
{
	setlocale(LC_ALL, ""); // 设置地域,第二个参数字符串为空表示使用当前操作系统的地域

	char s1[] = "中A国"; // 使用多字节字符集(gb2312)
	wchar_t s2[] = L"中A国"; // 使用unicode字符集
	
	printf("%s\n", s1);	
	wprintf(L"%s\n", s2); // 必须setlocale告诉控制台使用Unicode编码显示
	
	printf("%d\n", strlen(s1));
	printf("%d\n", wcslen(s2));

	return 0;
}

在这里插入图片描述

扩展ASCII中,英文占1字节,高位是0,中文占2字节,高位是1。因此第一个字符串的长度是2+1+2=5;第二个字符串使用Unicode,固定每个字符不管英文中文都是2字节, 宽字符版本的函数计算出来的长度是字符的个数,也就是3。

在这里插入图片描述

三、使用宏解决兼容性问题

当项目由多人开发,可能出现一个问题:一个人用的项目是多字节字符集编码,另一个人用的是Unicode编码,这样两人的代码合并就会出现问题。所以windows提供了一系列宏,在程序中使用宏,会自动根据项目的字符集来替换成相应类型。

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章