在讨论数组存储汉字之前,首先要明确一个基本概念:汉字存储占用空间大小与使用何种编码方式有关。
常见的中文编码 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
];
}
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’的问题(重要)