当前位置: 首页 > news >正文

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

文章目录

  • 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 汉字内码及区位码 提取

相关文章:

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

文章目录 0 背景1 了解编码1.1 ASCII码1.2 机内码、国标码、区位码1.2.1 区位码1.2.2 国标码&#xff08;GB 2312-80&#xff09;1.2.3 汉字机内码&#xff08;GB 2312&#xff09; 1.3 GBK和GB2312的区别2 编码实现2.1 QString数据转QByteArray类型2.1.1 使用QTextCodec2.1.2 …...

linux网络编程 | c | epoll实现IO多路转接服务器

epoll实现IO多路转接服务器 可通过以下视频学习 06-opell函数实现的多路IO转接_哔哩哔哩_bilibili 通过响应式–多路IO转接实现 文章目录 epoll实现IO多路转接服务器1.思路&功能核心思路 2.代码实现multi_epoll_sever.c运行图 1.思路&功能 **功能&#xff1a;**客…...

Source Insight的使用经验汇总

01-Add All"和“Add Tree”有何区别&#xff1f; 在 Source Insight 中&#xff0c;“Add All”和“Add Tree”是两种向项目&#xff08;Project&#xff09;中添加文件的操作选项&#xff0c;它们的区别在于处理文件和目录的方式不同&#xff1a; 1. Add All 范围&am…...

VSCode 报错:rust-analyzer requires glibc >= 2.28 in latest build

报错信息 /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.953/server/rust-analyzer: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.29 not found (required by /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.9…...

Android Link to Death 使用

Java侧&#xff1a; 【android学习】使用linkToDeath对AIDL双向死亡监听_unlinktodeath-CSDN博客 Native侧&#xff1a; Service端 using namespace android; class MyService :public IBinder::DeathRecipient{void MyService::binderDied(const wp<IBinder>& wh…...

【C++游记】string的使用和模拟实现

枫の个人主页 你不能改变过去&#xff0c;但你可以改变未来 算法/C/数据结构/C Hello&#xff0c;这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕&#xff0c;我们继续来学习C的内容呀。C是接近底层有比较经典的语言&#xff0c;因此学习起来注定枯燥无味&#xf…...

DockerUI info存在未授权访问漏洞

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

SQL,查询每天最接近指定时间的记录

Oracle 数据库的某表有一列是日期时间类型&#xff0c;每天对应多条数据&#xff1a; td1.1.2024 08:08:0811.1.2024 10:10:1021.1.2024 15:15:1531.1.2024 20:20:2042.1.2024 09:09:0952.1.2024 12:12:1262.1.2024 16:16:16712.12.2024 16:16:168 现在要从每天找出两条记录&…...

ElasticSearch如何做性能优化?

大家好&#xff0c;我是锋哥。今天分享关于【ElasticSearch如何做性能优化&#xff1f;】面试题。希望对大家有帮助&#xff1b; ElasticSearch如何做性能优化&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&#xff0c;性能优化是…...

【Linux】虚拟空间布局模型地址回填数据段合并(万字详解)

Ⅰ、虚拟空间布局模型 理论模型 包括上节的动态库与静态库&#xff0c;加上本节后面两个内容其实都是对gcc的扩展与补充知识&#xff0c;也是需要了解和掌握的知识。在开讲之前&#xff0c;我们先来说一下在32位x86的Linux系统中&#xff0c;虚拟地址空间布局模型&#xff1a…...

const和修饰指针的几种用法

昨天闲着没事去面试了一个C岗位&#xff0c;问了很多基础的东西都没答上来。主要原因是这些知识在硬件资源丰富的pc端用的不多&#xff0c;二来确实很久没温习之前的C相关的知识了。在面试官问了几次类似的问题没有答好的情况下&#xff08;还喜欢问你确不确定&#xff09;&…...

mybatis事务的自动提交与手动提交

MyBatis支持自动提交和手动提交两种事务管理方式。 自动提交事务 MyBatis默认使用自动提交模式&#xff0c;即每个SQL操作都会自动提交到数据库中。这意味着在执行完一条SQL语句后&#xff0c;MyBatis会自动调用commit()方法将更改持久化到数据库。 手动提交事务 可以通过Sq…...

网络安全协议之比较(SSH、PKI、SET、SSL)

一、SSH介绍 什么是SSH&#xff1f;   传统的网络服务程序&#xff0c;如&#xff1a;ftp、pop和telnet在本质上都是不安全的&#xff0c;因为它们在网络上用明文传送口令和数据&#xff0c; 别有用心的人非常容易就可以截获这些口令和数据。而且&#xff0c;这些服务程序的…...

Vue的生命周期方法

Vue 生命周期方法详解 beforeCreate 执行时机&#xff1a;在实例初始化之后&#xff0c;数据观测&#xff08;data observer&#xff09;和事件配置&#xff08;event/watcher setup&#xff09;之前被调用。内部状态&#xff1a;此时&#xff0c;组件的选项对象&#xff08;例…...

ISP和IQ调试(一)

系列文章目录 文章目录 系列文章目录前言一、ISP&#xff08;image signal process)二、ISP位置三、IQ总结 前言 一、ISP&#xff08;image signal process) image signal process 图像处理技术 image signal processor 图像信号处理器 设备 什么是图像信号&#xff1f; 代表…...

c# TaskScheduler

这里记录下 TaskScheduler 的简单用法。 使用场景&#xff1a; 使用 Task 的时候&#xff0c;大家知道用 TaskFactory.StartNew 可以用来创建一个 Task 。这里如果创建了 3 个&#xff0c;那么这3个 Task 就各自放飞直接运行了。 class Program {private static TaskFactory…...

可视化数据

数据科学家会直观呈现数据&#xff0c;以更好地理解数据。 他们可以扫描原始数据、检查摘要度量值&#xff08;如平均值&#xff09;或绘制数据图表。 图表是一种可视化数据的强有力方式&#xff0c;数据科学家经常使用图表快速了解适度复杂的模式。 直观地表示数据 绘制图表…...

【Redis】Redis缓存击穿

1. 概述 缓存击穿&#xff1a;缓存击穿问题也叫热点key问题&#xff0c;一个高并发的key或重建缓存耗时长&#xff08;复杂&#xff09;的key失效了&#xff0c;此时大量的请求给数据库造成巨大的压力。如下图&#xff0c;线程1还在构建缓存时&#xff0c;线程2&#xff0c;3&…...

厦门凯酷全科技有限公司深耕抖音电商运营

在数字经济飞速发展的今天&#xff0c;抖音电商平台以其独特的社交属性和庞大的用户基础&#xff0c;迅速成为众多品牌和商家的新战场。在这个充满机遇与挑战的市场中&#xff0c;厦门凯酷全科技有限公司凭借其专业的服务、创新的理念和卓越的执行力&#xff0c;成为了抖音电商…...

六西格玛DMAIC在企业得项目管理中有什么作用

六西格玛&#xff08;Six Sigma&#xff09;是一种以数据为基础的管理方法&#xff0c;旨在通过减少缺陷和变异来提高过程质量和效率。DMAIC 是六西格玛中一种常用的改进方法论&#xff0c;适用于现有过程的改进。DMAIC 代表五个阶段&#xff1a;定义&#xff08;Define&#x…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...