编码表:https://www.toolhelper.cn/Encoding/GB2312
GB2312 编码表
GB 2312 标准由中国国家标准总局 1980 年发布,GB 即国标,共收录 6763 个汉字,其中一级汉字 3755 个,二级汉字 3008 个。
GB 2312 的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆 99.75% 的使用频率。
对于人名、古汉语等方面出现的罕用字,GB 2312 不能处理,这导致了后来 GBK 及 GB 18030 汉字字符集的出现。
GB 2312 收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的 682 个全角字符。
GB 2312 兼容 ASCII 码(0 - 127),之后对任意一个图形字符都采用两个字节表示,高位字节和低位字节都大于 127。
GB 2312 字符集分成 94 个区,每区有 94 个位,分别对应第一字节和第二字节,这种表示方式也称为区位码。
01-09 区为特殊符号
10-15 区为用户自定义符号区(未编码)
16-55 区为一级汉字,按拼音排序,共 3755 个
56-87 区为二级汉字,按部首/笔画排序,共 3008 个
88-94 区为用户自定义汉字区(未编码)
代码如下
#include <iostream>
#include <string>
using namespace std;
typedef unsigned char UINT8;
void SendComplexString(const char *gb2312)
{
UINT8 p[128] = { 0 };
char *c;
UINT8 len = 0, size = 0, i = 0;
UINT8 temp = 0xff;
while (1)
{
if (gb2312[i] != '\0')
{
i++;
}
else
{
len = i;
break;
}
}
// 统计结果,中国ab 的字符数为6
//printf("------------%d\n", len);
c = (char *)gb2312;
//printf("gb2312+++++++++++%s\n", gb2312);
//printf("c+++++++++++%s\n", c);
//p = SendData;
//printf("p+++++++++++%s\n", p);
//printf("!------------%x\n", '!');
//printf("0------------%x\n", '\0');
//printf("------------%x\n", ' ');
//printf("0------------%x\n", '0');
for (i = 0; i < len;)
{
temp = *c % 0xff; // temp = *c & 0xff;
//printf("temp------------%x\n", temp);
//printf("c------------%x\n", *c);
//if (*c == '\0')
if (temp == '\0')
{
//printf("000000000000\n");
break;
}
//else if (*c < ' ')
else if (temp < ' ')
{
i += 1;
c += 1;
//printf("1111111111111\n");
}
//else if (*c >= ' ' && *c <= 127)
else if (temp >= ' ' && temp <= 127)
{
//printf("22222222222222\n");
p[size] = 0xa3;
p[size + 1] = temp - ' ' + 0xa0;
i += 1;
c += 1;
size += 2;
}
else
{
//printf("33333333333333\n");
p[size] = temp;
i += 1;
c += 1;
size += 1;
}
}
//printf("size------------%d\n", size);
// 发码
for (i = 0; i < size; i++)
{
printf("------------%x\n", p[i]);
}
printf("p+++++++++++%s\n", p);
}
int main() {
cout << "0 ";
cout << endl;
SendComplexString("中国ab12!@#$%^&*()_+-=`,./;'\[]<>?:|{},。、;‘【】《》?:“中国");
cout << "1 ";
cout << endl;
return 0;
}
结果