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 国标码(GB 2312-80)1.2.3 汉字机内码(GB 2312) 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.思路&功能 **功能:**客…...

Source Insight的使用经验汇总
01-Add All"和“Add Tree”有何区别? 在 Source Insight 中,“Add All”和“Add Tree”是两种向项目(Project)中添加文件的操作选项,它们的区别在于处理文件和目录的方式不同: 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侧: 【android学习】使用linkToDeath对AIDL双向死亡监听_unlinktodeath-CSDN博客 Native侧: Service端 using namespace android; class MyService :public IBinder::DeathRecipient{void MyService::binderDied(const wp<IBinder>& wh…...

【C++游记】string的使用和模拟实现
枫の个人主页 你不能改变过去,但你可以改变未来 算法/C/数据结构/C Hello,这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕,我们继续来学习C的内容呀。C是接近底层有比较经典的语言,因此学习起来注定枯燥无味…...
DockerUI info存在未授权访问漏洞
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

SQL,查询每天最接近指定时间的记录
Oracle 数据库的某表有一列是日期时间类型,每天对应多条数据: 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如何做性能优化?
大家好,我是锋哥。今天分享关于【ElasticSearch如何做性能优化?】面试题。希望对大家有帮助; ElasticSearch如何做性能优化? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中,性能优化是…...

【Linux】虚拟空间布局模型地址回填数据段合并(万字详解)
Ⅰ、虚拟空间布局模型 理论模型 包括上节的动态库与静态库,加上本节后面两个内容其实都是对gcc的扩展与补充知识,也是需要了解和掌握的知识。在开讲之前,我们先来说一下在32位x86的Linux系统中,虚拟地址空间布局模型:…...
const和修饰指针的几种用法
昨天闲着没事去面试了一个C岗位,问了很多基础的东西都没答上来。主要原因是这些知识在硬件资源丰富的pc端用的不多,二来确实很久没温习之前的C相关的知识了。在面试官问了几次类似的问题没有答好的情况下(还喜欢问你确不确定)&…...

mybatis事务的自动提交与手动提交
MyBatis支持自动提交和手动提交两种事务管理方式。 自动提交事务 MyBatis默认使用自动提交模式,即每个SQL操作都会自动提交到数据库中。这意味着在执行完一条SQL语句后,MyBatis会自动调用commit()方法将更改持久化到数据库。 手动提交事务 可以通过Sq…...
网络安全协议之比较(SSH、PKI、SET、SSL)
一、SSH介绍 什么是SSH? 传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据, 别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的…...
Vue的生命周期方法
Vue 生命周期方法详解 beforeCreate 执行时机:在实例初始化之后,数据观测(data observer)和事件配置(event/watcher setup)之前被调用。内部状态:此时,组件的选项对象(例…...

ISP和IQ调试(一)
系列文章目录 文章目录 系列文章目录前言一、ISP(image signal process)二、ISP位置三、IQ总结 前言 一、ISP(image signal process) image signal process 图像处理技术 image signal processor 图像信号处理器 设备 什么是图像信号? 代表…...
c# TaskScheduler
这里记录下 TaskScheduler 的简单用法。 使用场景: 使用 Task 的时候,大家知道用 TaskFactory.StartNew 可以用来创建一个 Task 。这里如果创建了 3 个,那么这3个 Task 就各自放飞直接运行了。 class Program {private static TaskFactory…...

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

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

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

六西格玛DMAIC在企业得项目管理中有什么作用
六西格玛(Six Sigma)是一种以数据为基础的管理方法,旨在通过减少缺陷和变异来提高过程质量和效率。DMAIC 是六西格玛中一种常用的改进方法论,适用于现有过程的改进。DMAIC 代表五个阶段:定义(Define&#x…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...