Qt编写区位码gb2312、机内码、国标码————附带详细介绍和编码实现

news2025/3/9 10:20:36

文章目录

  • 0 背景
  • 1 了解编码
    • 1.1 ASCII码
    • 1.2 机内码、国标码、区位码
      • 1.2.1 区位码
      • 1.2.2 国标码(GB 2312-80)
      • 1.2.3 汉字机内码(GB 2312)
  • 1.3 GBK和GB2312的区别
  • 2 编码实现
    • 2.1 QString数据转QByteArray类型
      • 2.1.1 使用QTextCodec
      • 2.1.2 使用toLocal8Bit(推荐)
    • 2.2 QByteArray数据转QString类型
    • 2.3 测试区位码gb2312
      • 2.3.1 测试代码1(推荐)
      • 2.3.2 测试代码2
  • 参考

0 背景

因为需要对发送的汉字数据进行区位码编码,于是查询了如何进行编码。下文是查询笔记和实现总结。

1 了解编码

编码前,首先要了解四个码:ASCII码、机内码、国标码、区位码。

1.1 ASCII码

键盘上数字、字母和符号的单个为字符,组合起来成为字符串。

键盘上所能表示的字符有128个,刚好是27,在7位的最前面补一个0,变成8位(bit),即一个字节(Byte)。每个字符都对应一个8位的二进制编码。

在这里插入图片描述
上表为10进制表示的ASCII码表,例如字母A对应的10进制数为65,表示的16进制为41H,即二进制编码:0100,0001。

ASCII码中字符被分成三类:可印刷字符、控制字符、通信字符
  1,可印刷字符:32~126都是可印刷字符。可以打印出来给人看的。
  2,控制字符:127是控制字符,DEL就是键盘上的delete,用于删除。
  3,通信字符:0~32,比如6,ACK,在两个电脑通信时,会一方接到另一方传来的数据时,就会回一个ACK包。

1.2 机内码、国标码、区位码

机内码、国标码、区位码的三者转换关系为:

读取数据编码时:
机内码—>国标码---->区位码
1,把数据按字符串读取,就可以得到机内码;
2,机内码减去8080H(将最高位变为0),就是国标码;
3,国标码再减去32(2020H),就是区位码;

接收数据解码时:
区位码---->国标码—>机内码
1,把区位码加上2020H(区分ASCII码中的通信字符),得到国标码(GB2312-80);
2,把国标码加上8080H(区分ASCII码中的全部字符),得到 汉字机内码(GB2312)。

在这里插入图片描述

1.2.1 区位码

因为ASCII码只能表示英文字母,想表示中文,就需要额外的编码。这里使用的就是区位码(区域位置码)。

区位码中,汉字被分成了94个区域,每个区域有94个位置。就像是坐标一样,区是横坐标,位是纵坐标。
在这里插入图片描述
如下面区位码表中,的区位码为1601H,即16H是区,01H是位。
在这里插入图片描述

关于GB2312字符集的编集如下:
  1,01~09区(682个):特殊符号、数字、英文字符、制表符等,包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母等在内的682个全角字符;
  2,10~15区:空区,留待扩展;
  3,16~55区(3755个):常用汉字(也称一级汉字),按拼音排序;
  4,56~87区(3008个):非常用汉字(也称二级汉字),按部首/笔画排序;
  5,88~94区:空区,留待扩展。

1.2.2 国标码(GB 2312-80)

在网络传输过程中:A要给B传输一个数据,如果A传去的数据是用GB2312-80编的,而B读取地方式是用ASCII方式的,GB 2312-80将区位码传过去,当B收到时会先读到区码,因为区码和位码的范围用十进制表示都是0~93,如果此时的区码的十进制是6,那么ASCII对应的6则是ACK,会发现ACK是回包的指示。那么就会出现问题。

为了解决这一问题,将区位码的区码和位码都+32,区码和位码的范围就变成了32-125,而ASCII的通信字符是0到32,就避开了与ASCII中通信字符与控制字符的相同的情况,提高了ASCII和区位码的兼容性。

而这种32~125的区位码就是:国标码(GB2312 -80)

但是国标码是用十六进制表示的,实际上是在区位码的区码和位码分别加上20H(十进制:32),也就是加上2020H,最后得到了GB 2312-80

1.2.3 汉字机内码(GB 2312)

国标码是为了防止与ASCII的控制字符和通信字符冲突,但是还是会和打印字符发送冲突,因此为了彻底让国标码和ASCII兼容。就再GB 2312-80(国标码)的基础上分别在加上8080H,也就是在区码和位码上再加上128(80H)。最后得到了:汉字机内码,GB 2312就是汉字机内码。

由于ASCII的范围是再0-127,而GB 2312在(128+32=160)160~253(93+160),因此GB2312与ASCII就不会发生冲突了,使得中国汉字与外国英文兼容了。

最后在计算机内部,使用的就是汉字机内码(GB 2312)。

1.3 GBK和GB2312的区别

收录不同:GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;GBK共收入21886个汉字和图形符号。

表示不同:GB2312对任意一个图形字符都采用两个字节表示,并对所收汉字进行了“分区”处理,每区含有94个汉字/符号,分别对应第一字节和第二字节。GBK是采用单双字节变长编码,英文使用单字节编码,完全兼容ASCII字符编码,中文部分采用双字节编码。

GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大。

2 编码实现

编码后,使用如下工具进行查询和比对:
1,汉字区位码查询网站;
2,在线转换查询网站;
3,在线查询软件;

2.1 QString数据转QByteArray类型

2.1.1 使用QTextCodec

该类的官方使用文档。

注意:QTextcodec在QT6中已经被弃用,取而代之的是QTextCodec(注意大小写)。

头文件:

#include <QTextCodec>
#include <qDebug>
#include <QByteArray>
    QByteArray content = "啊阿埃挨";
    QByteArray resData = QTextCodec::codecForName("GB2312")->fromUnicode(content);
    qDebug()<<resData.toHex().toUpper();

输出:

B0A1B0A2B0A3B0A4

2.1.2 使用toLocal8Bit(推荐)

     QString str("啊");
     QByteArray data = str.toLocal8Bit();//转为本地8bit编码格式,对于windows系统,本地编码格式为GBK,linux系统为UTF-8。
     qDebug()<<"resData:"<<data.toHex().toUpper();

输出:

B0A1

2.2 QByteArray数据转QString类型

QByteArray content = "啊阿埃挨";
QByteArray resData = QTextCodec::codecForName("GB2312")->fromUnicode(content);
QString strUnicode= QTextCodec::codecForName("GB2312")->toUnicode(resData.data());
qDebug()<<strUnicode;

2.3 测试区位码gb2312

2.3.1 测试代码1(推荐)

     QString str("啊");
     QByteArray data = str.toLocal8Bit();//获取机内码 :转为本地8bit编码格式,对于windows系统,本地编码格式为GBK,linux系统为UTF-8。

    QByteArray resData;
    char first = data.data()[0] - 0xa0;
    char second  = data.data()[1] - 0xa0;
    resData += first;
    resData += second;

    QString hexStringHigh = resData.mid(0,1).toHex();
    QString hexStringLow = resData.mid(1,1).toHex();
    bool ok;
    uint decimalHigh = hexStringHigh.toUInt(&ok, 16);
    uint decimalLow = hexStringLow.toUInt(&ok, 16);

    qDebug()<<"汉字机内码:"<<data.toHex().toUpper();
    qDebug()<<"16进制的区位码gb2312:"<<resData.toHex().toUpper();
    qDebug()<<"10进制的区位码gb2312:"<<decimalHigh<<decimalLow;

输出:

汉字机内码: "B0A1"
16进制的区位码gb2312: "1001"
10进制的区位码gb2312: 16 1

2.3.2 测试代码2

    QString text_str("啊");
    const char *hanzi=qPrintable(text_str);
    QByteArray ba(hanzi);
    char *data = ba.data();

    char s[3];
    s[0]='0';
    s[1]='0';
    s[2]='0';

    sprintf(s, "%x", data[0]);
    QString qstr1 = QString::fromStdString(s);
    sprintf(s, "%x", data[1]);
    QString qstr2 = QString::fromStdString(s);

    QString s1=qstr1.right(2);
    QString s2=qstr2.right(2);

    bool ok;
    int quwei=(s1.toUpper()+s2.toUpper()).toInt(&ok,16)-0xA0A0;
    QString qstr3=QString::number(quwei,16);

    qDebug()<<"汉字内码高位:"<<s1;
    qDebug()<<"汉字内码低位:"<<s2;
    qDebug()<<"16进制区位码:"<<qstr3;

参考

srhqwe:编码格式说明

涛··:Qt之GB2312\GBK字符与QString转换

wkm956:Qt获取汉字区位码

丁老师的技术随笔:Qt 汉字内码及区位码 提取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2259270.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux系统】—— 权限的概念

【Linux系统】—— 权限的概念 1 权限1.1 什么是权限1.2 为什么要有权限1.3 理解权限 2 文件的权限2.1 文件角色2.2 文件权限2.3 修改文件权限2.3.1 修改目标属性2.3.1.1 字符修改法2.3.1.2 8进制修改法 2.3.2 修改角色 3 文件权限补充知识点3.1 只能修改自己的文件权限3.2 没有…

js:我要在template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写

问&#xff1a; 我按在要在template中v-for循环遍历这个centrerTopdata&#xff0c;我希望自循环前面三个就可以了怎么写&#xff1f; 回答&#xff1a; 问&#xff1a; <div v-for"(item, index) in centrerTopdata.slice(0, 3)" :key"index"> d…

016 在路由器上配置 DHCP

配置路由器端口IP地址 将路由器的端口地址配置好&#xff0c; 左边的网络地址是 192.168.1.0 右边的网络地址是 192.168.2.0 配置路由器的DHCP服务 打开命令窗口&#xff0c;进入特权模式 进入全局配置 conf t创建一个DHCP地址池&#xff1b; po1 是地址池的名称&#xf…

使用IP自签名SSL证书

最近需要创建WebSocket服务器并使用SSL证书&#xff0c;由于是内网测试&#xff0c;所以需要使用指定IP的自签SSL证书。 其实笔者前面博文 使用nexus3作为Docker镜像仓库 解决nexus3登录x509: certificate has expired or is not yet valid 中有创建过相应的证书&#xff0c;这…

多模态大模型(二)——用Transformer Encoder和Decoder的方法(BLIP、CoCa、BEiTv3)

文章目录 BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 理解、生成我都要&#xff0c;一个很有效的、根据图片生成caption的工具1. BLIP的研究动机2. BLIP的模型结构3. CapFilt Model4. BLIP的训练过程 CoCa: C…

vue季度选择器(antd2.0 版本无此控件,单独写一个)

vue季度选择器 效果显示 效果显示 <template><div><a-popoverplacement"bottom"overlayClassName"season-picker"trigger"click"v-model"showSeason"><template #content><div class"season-picker-b…

基于Spring Boot + Vue的摄影师分享交流社区的设计与实现

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…

利用GeoWave导入矢量数据到HBase/Accumulo数据库

前言 最近在做有关地理时空大数据的实验&#xff0c;本文将介绍如何利用geowave框架&#xff0c;将矢量数据导入到HBase或Accumulo等NoSQL数据库中。 软件版本&#xff1a; Hadoop: 2.10.2 Zookeeper: 3.6.4 geowave: 1.2.0 Accumulo&#xff1a;1.9.3 HBase: 1.4.0 Ja…

常回家看看之Tcache Stashing Unlink Attack

前言&#xff1a; 在开始了解这个攻击手法的前提&#xff0c;需要先了解一个函数也就是calloc函数&#xff0c;众所周知&#xff0c;当libc版本大于等于2.27的时候会引入tcachebin&#xff0c;而Tcache Stashing Unlink Attack就是发生在2.27版本以上&#xff0c;那么这个和ca…

心情追忆- SEO优化提升用户发现率

之前&#xff0c;我独自一人开发了一个名为“心情追忆”的小程序&#xff0c;旨在帮助用户记录日常的心情变化及重要时刻。我从项目的构思、设计、前端&#xff08;小程序&#xff09;开发、后端搭建到最终部署。经过一个月的努力&#xff0c;通过群聊分享等方式&#xff0c;用…

深入探索:createThread与cancelThread的用法及实例

在多线程编程领域,线程的创建与管理是核心技能之一。本文将详细介绍两个关键函数:createThread(用于创建新线程)和cancelThread(用于取消已存在的线程),并通过具体实例展示它们的用法。需要注意的是,不同的编程语言和线程库可能有不同的API设计,但基本概念是相通的。本…

Cherno C++学习笔记 P36 初始化类成员

这一篇文章我们主要讲一下如何初始化类成员&#xff0c;并给出一个初始化类成员的小技巧。我们都知道&#xff0c;我们会使用构造函数来初始化我们的类成员变量。 首先我们来举一个简单的小例子&#xff0c;展现一下构造函数的功能&#xff1a; #include<iostream> #in…

快速解决git@github.com: Permission denied (publickey)

在使用github进行项目克隆的时候&#xff0c;有些时候会出现“gitgithub.com: Permission denied (publickey)”的错误。这个问题大部分是由于新设备本地密钥未加入gitbub列表中&#xff0c;我们可以通过加入新机器身份验证解决问题。 一、问题现象 二、问题解决 2.1&#xf…

移动端h5自适应rem适配最佳方案

网页开发中&#xff0c;我们常用的单位有如下几个&#xff1a; px&#xff1a;像素固定&#xff0c;无法适配各分辨率的移动设备em: 该单位受父容器影响&#xff0c;大小为父元素的倍数rem: 因为html根元素大小为16px&#xff0c;所以默认 1rem 16px&#xff0c;rem只受根元素…

C语言程序设计P5-5【应用函数进行程序设计 | 第五节】—知识要点:变量的作用域和生存期

知识要点&#xff1a;变量的作用域和生存期 视频&#xff1a; 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 有一个一维数组&#xff0c;内放 10 个学生成绩&#xff0c;写一个函数&#xff0c;求出平均分、最高分和最低分。 任务要求用一个函数来完…

Jenkins与SonarQube持续集成搭建及坑位详解

Jenkins和SonarQube都是软件开发过程中常用的工具,它们在代码管理、构建、测试和质量管理方面发挥着重要作用。以下是关于Jenkins与SonarQube的作用及整合步骤环境搭建的详细解释: 一、Jenkins与SonarQube的作用 Jenkins: Jenkins是一个开源的持续集成和交付工具,它可以帮…

item2 for macos

安装Item2 brew install iterm2 查看终端类型 cat /etc/shells Mac OS X 10.15 已经将默认的shell从Bash换成了zsh&#xff0c;所以不用安装&#xff0c;10.15以前的可以使用下面的命令进行安装 brew install zsh 安装Oh My ZSH # curl sh -c "$(curl -fsSL https://ra…

[搜广推]王树森推荐算法——基于物体的协同过滤

基于物体的协同过滤 ItemCF 基于物体的协同过滤&#xff08;Item-Based Collaborative Filtering&#xff0c;简称ItemCF&#xff09;是一种经典的推荐系统算法 基本思想 量化用户对物品的兴趣&#xff0c;通过分析用户的行为来找到与目标物品相似的其他物品&#xff0c;然后…

3D 生成重建035-DiffRF直接生成nerf

3D 生成重建035-DiffRF直接生成nerf 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 本文提出了一种基于渲染引导的三维辐射场扩散新方法DiffRF&#xff0c;用于高质量的三维辐射场合成。现有的方法通常难以生成具有细致纹理和几何细节的三维模型&#xff0c;并且容易出…

计算机毕业设计Python+CNN卷积神经网络高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…