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

在讨论数组存储汉字之前,首先要明确一个基本概念

汉字存储占用 空间大小 与使用的 编码方式 有关。

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

编码对象编码类型存储空间
单个汉字GB23122字节
单个汉字GBK2字节
单个汉字GB180304字节
单个汉字UTF-83字节

以下内容是关于 GBUTF-8 字符集下对存储汉字的数组进行初始化的实例。

一、GB2312 和 GBK 字符集初始化

1. 使用数组存储1个汉字

char a[] = "字";    // 定义一个汉字的数组
char a[] = {"字"};  // 也可以加上 { }
这两种情况下系统会在数组后面自动加上'\0',即 a[2] = '\0',“字”占用 a[0] 和 a[1]2个字节;
也可以这样写:
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' 汉字部分占 a[0]~a[9]10个字节;
也可以这样写:
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 个字节 空间,其它与使用 GB2312GBK 字符集的初始化方法一样

这里仅给出使用数组存储 1 个汉字的实例:

char a[] = "字";    // 定义一个汉字的数组
char a[] = {"字"};  // 也可以加上 { }
这两种情况系统都会在后面自动加上'\0',即 a[3] = '\0' 汉字占 a[0]、a[1] 和 a[2]3个字节 ;
也可以这样写:
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’的问题(重要)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值