其他分享
首页 > 其他分享> > C:汉字存储

C:汉字存储

作者:互联网

问题

C语言中汉字如何存储?梳理思路!

答案

在计算机中,一个英文字符占1个字节,汉字占两个字节,如果用char字符数组存储字符时,需要在最后面自动加上一个字节的结束符“\0”

汉字转进制输出

比如:

    //英文字符,占4个字节
    char Info[] = "abc";
    printf("%s\n",Info);
    printf("Info长度:%d\n",sizeof(Info));

    //中文,占5个字节
    char Han[]="中国";
    printf("%s\n",Han);
    printf("Han长度:%d\n",sizeof(Han));

不同的编码方式,汉字存储的字节数量不同,比如:

GB2312编码:一个汉字两个字节

UTF-8编码: 一个汉字三个字节

GBK编码:一个汉字两个字节

UTF-16:一个汉字3个字节

GB2312 --> GBK --> GB18030 是中文编码的三套方案,出现的时间从早到晚,收录的字符数目依次增加,并且向下兼容。GB2312 和 GBK 收录的字符数目较少,用 1~2个字节存储;GB18030 收录的字符最多,用1、2、4 个字节存储。
1) 从整体上讲,GB2312 和 GBK 的编码方式一致,具体为:

例如对于字母A,它在内存中存储为 01000001;对于汉字,它在内存中存储为 11010110  11010000。由于单字节和双字节的最高位不一样,所以字符处理软件很容易区分一个字符到底用了几个字节。
2) GB18030 为了容纳更多的字符,并且要区分两个字节和四个字节,所以修改了编码方案,具体为:

例如对于字母A,它在内存中存储为 01000001;对于汉字,它在内存中存储为 11010110  11010000;对于藏文གྱུ,它在内存中的存储为 10000001  00110010  11101111  00110000。

字符处理软件在处理文本时,从左往右依次扫描每个字节:

可见,当字符占用两个或者四个字节时,GB18030 编码要检测两次,处理效率比 GB2312 和 GBK 都低。

GBK 于 1995 年发布,这一年也是互联网爆发的元年,国人使用电脑越来越多,也许是 GBK 这头猪正好站在风口上,它就飞起来了,后来的中文版 Windows 都将 GBK 作为默认的中文编码方案。
注意,这里我说 GBK 是默认的中文编码方案,并没有说 Windows 默认支持 GBK。Windows 在内核层面使用的是 Unicode 字符集(严格来说是 UTF-16 编码),但是它也给用户留出了选择的余地,如果用户不希望使用 Unicode,而是希望使用中文编码方案,那么这个时候 Windows 默认使用 GBK(当然,你可以选择使用 GB2312 或者 GB18030,不过一般没有这个必要)。

汉字编码输出

汉字编码并输出示例:

    //汉字编码
    unsigned char Han[]="中国";
    printf("汉字:%s\n",Han);
    printf("十六进制:");
    for(int i=0;i<4;i++)
    {
        printf("%X",Han[i]);
    }
    printf("\n十进制:");
    for(int i=0;i<4;i++)
    {
        printf("%d",Han[i]);
    }

汉字编码输出存储

汉字编码存储示例:

	//汉字编码存储
	unsigned char Han[] = "中国";
	FILE* fp = fopen("out.txt", "w");//输出
	printf("汉字:%s\n", Han);
	fputs("十六进制:", fp);
	for (int i = 0; i < 4; i++)
	{
		fprintf(fp, "%X", Han[i]);
	}
	fseek(fp, 0, SEEK_END);
	fputs("\n十进制:", fp);
	for (int i = 0; i < 4; i++)
	{
		fprintf(fp, "%d", Han[i]);
	}
	fclose(fp);

参考

1、汉字的存储

2、使用数组来储存中文(字符串)

3、C语言:GB2312编码和GBK编码,将中文存储到计算机

4、C语言/C++字符编码方式解析

标签:字符,存储,字节,Han,GBK,汉字,GB2312
来源: https://www.cnblogs.com/pam-sh/p/15034330.html