C语言数组存储汉字问题小结

it2023-09-18  75

在讨论数组存储汉字之前,首先要明确一个基本概念:汉字存储占用空间大小与使用何种编码方式有关。

常见的中文编码 GB2312(国标简体中文字符集)和 GBK(国标扩展)使用 2 个字节编码来表示一个汉字,不常用的 GB18030 使用 4 个字节编码来表示一个汉字,更通用的 UTF-8 编码使用 3 个字节编码来表示一个汉字。关于编码方式的更详细的介绍请移步文末参考链接。

以下总结了 GB 和 UTF-8 字符集下,对存储汉字的数组进行初始化的实例。

一、在使用 GB2312 或 GBK 字符集时,使用如下实例进行初始化:

1. 使用数组存储1个汉字
char a[] = "字"; // 定义一个汉字的数组 char a[] = {"字"}; // 也可以加上 { } 这两种情况系统都会在后面自动加上'\0',即a[2] = '\0' 汉字占2个字节a[0]和a[1]; 也可以这样: char a[3] = "字"; char a[3] = {"字"}; 以上两种方法定义的空间是一样大的,都是3个字节。 char i; for(i=0;i<3;i++) { printf("a[%d] = 0x%x;\r\n",i,a[i]); } 使用 char 时 output: a[0] = 0xffffffd7; a[1] = 0xffffffd6; a[2] = 0x00; 使用 unsigned char 时output: a[0] = 0xd7; a[1] = 0xd6; a[2] = 0x00;
2. 使用数组存储汉字字符串
char a[] = "汉字字符串"; // 定义多个汉字的数组 char a[] = {"汉字字符串"}; // 也可以加上 { } 同样系统会在后面自动加上'\0',即 a[10] = '\0' 汉字占10个字节a[0]~a[9]; 也可以这样: char a[11] = "汉字字符串"; char a[11] = {"汉字字符串"}; 以上两种方法定义的空间是一样大的,都是11个字节。
3. 数组空间大于汉字字符数的情形
char a[11] = "汉字"; char a[11] = {"汉字"}; 这种方法定义数组,系统会将 a[5]~a[10] 自动添加'\0'
4. 多维数组的使用
char a[2][9] = {"多维数组", "这样表示"}; //使用多维数组的情形 char a[2][9] = {{"多维数组"}, {"这样表示"}}; //也可以加 { } 其中: a[0] = "多维数组"; a[1] = "这样表示";
5. 字符指针的使用
char * ArrayName = "使用字符指针"; // 同样可以加 { } 或: char * ArrayName; ArrayName = "使用字符指针"; // 同样可以加 { } char * ArrayName[2] = {{"字符指针数组"},{"字符指针数组"}}; 或: char * ArrayName[2]; ArrayName[0] = "字符指针数组"; // 同样可以加 { } ArrayName[1] = "字符指针数组";
6. 数组之间传递汉字
系统中汉字的输入,一般由键盘输入、文件读取、远程通信等接口函数输入,其本质上还是对字符的传递,下面给出最简单的传递汉字的方法: char i; char a[2][9]; char b[9] = {"传递汉字"}; for(i=0;i<9;i++) { a[0][i] = b[i]; // 将 b 数组中的汉字转存到 a[0] 数组中 } printf("%s",a[0]); output:传递汉字

二、在使用 UTF-8 字符集时,单个汉字占用 3 个字节空间,其它与使用 GB2312 或 GBK 字符集的初始化方法一样:

这里仅列出使用数组存储 1 个汉字的实例
char a[] = "字"; // 定义一个汉字的数组 char a[] = {"字"}; // 也可以加上 { } 这两种情况系统都会在后面自动加上'\0',即 a[3] = '\0' 汉字占3个字节 a[0]、a[1]和a[2]; 也可以这样: char a[4] = "字"; char a[4] = {"字"}; 以上两种方法定义的空间是一样大的,都是4个字节。 char i; for(i=0;i<4;i++) { printf("a[%d] = 0x%x;\r\n",i,a[i]); } 使用char时output: a[0] = 0xffffffe5; a[1] = 0xffffffad; a[2] = 0xffffff97; a[3] = 0x00; 使用unsigned char时output: a[0] = 0xe5; a[1] = 0xad; a[2] = 0x97; a[3] = 0x00;

参考链接:使用数组来储存中文(字符串) 参考链接:中文汉字存入char数组 参考链接:utf-8的中文是一个汉字占三个字节长度吗? 参考链接:一个汉字占多少个字节? 参考链接:程序员必备:彻底弄懂常见的7种中文字符编码(原文地址) 参考链接:程序员必备:彻底弄懂常见的7种中文字符编码(重要) 参考链接:C 字符数组与字符串的使用及加结束符’\0’的问题(重要)

最新回复(0)