关于UNICODE字符集

UNICODE字符集有多个编码方式,分别是UTF-8,UTF-16和UTF-32。
UTF-8:采用变长字节 (1 ASCII, 2 希腊字母, 3 汉字, 4 平面符号) 表示,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10 开头。UTF-8最多可用到6个字节。
UTF-16:采用2字节,Unicode中不同部分的字符都同样基于现有的标准。
UTF-32:采用4字节。
使用UTF-8编码时ASCII字符只占1个字节,存储效率比较高,适用于拉丁字符较多的场合以节省空间。对于大多数非拉丁字符(如中文和日文)来说,UTF-16所需存储空间最小,每个字符只占2个字节。采用UTF-16和UTF-32会有Big Endian和Little Endian之分,而UTF-8则没有字节顺序问题,所以UTF-8适合传输和通信。


编辑文本,保存为utf-8:

	FILE *myfile;
	wchar_t *name=L"aaa.txt";
	myfile=_wfopen(name,L"rb");
	fseek(myfile,3,0);
	char buff[100];
	//取得所有UTF-8字节
	fgets(buff,100,myfile);
	printf("字节数=%d\n",strlen(buff));
	printf("16进制值=");
	for(int i=0;i<strlen(buff);i++)
		printf("%hhx\t",buff[i]);

	int num=MultiByteToWideChar(CP_UTF8,NULL,buff,-1,NULL,NULL);
	wchar_t *buffw2=new wchar_t[num];
	MultiByteToWideChar(CP_UTF8,NULL,buff,-1,buffw2,num);

	int len = WideCharToMultiByte( CP_ACP, 0, buffw2, num, NULL, NULL, NULL, NULL );
	LPSTR lpsz = new CHAR[len+1];
	WideCharToMultiByte( CP_ACP, 0, buffw2, num, lpsz, len, NULL, NULL );
	lpsz[len]='\0';
	printf("\n字符串输出=");
	printf("%s\n",lpsz);
	system("pause");


编辑文本,保存为 UNICODE Little Endian

    FILE *myfile;
    wchar_t *name=L"ccc.txt";
    myfile=_wfopen(name,L"rb"); //按照二进制方式读
    fseek(myfile,0,0);
    wchar_t buffw[100];
    fgetws(buffw,100,myfile);
    printf("字节数=%d\n",wcslen(buffw));
    printf("16进制值=");
    for(int i=0;i<wcslen(buffw);i++)
        printf("%hhx\t",buffw[i]);
    //设置本地化信息,.936是简体中文的Code Page。wcout需要依靠它决定将宽字符按什么编码显示
    setlocale(LC_ALL, ".936");
    printf("\n字符串输出=");
    wcout<<buffw + 1<<endl;

文件编码为UNICODE Big Endian由于字节序的问题,需要转换成Little Endian 才能正确显示,因为x86系列用的是Little Endian。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值