深圳网站维护seo,做门户网站用什么系统,外贸网站外链平台,网站ping值文章目录 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 … 文章目录 0 背景1 了解编码1.1 ASCII码1.2 机内码、国标码、区位码1.2.1 区位码1.2.2 国标码GB 2312-801.2.3 汉字机内码GB 2312 1.3 GBK和GB2312的区别2 编码实现2.1 QString数据转QByteArray类型2.1.1 使用QTextCodec2.1.2 使用toLocal8Bit推荐 2.2 QByteArray数据转QString类型2.3 测试区位码gb23122.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比如6ACK在两个电脑通信时会一方接到另一方传来的数据时就会回一个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字符集的编集如下 101~09区(682个)特殊符号、数字、英文字符、制表符等包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母等在内的682个全角字符 210~15区空区留待扩展 316~55区(3755个)常用汉字(也称一级汉字)按拼音排序 456~87区(3008个)非常用汉字(也称二级汉字)按部首/笔画排序 588~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在(12832160)160~253(93160)因此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 QByteArrayQByteArray content 啊阿埃挨;QByteArray resData QTextCodec::codecForName(GB2312)-fromUnicode(content);qDebug()resData.toHex().toUpper();输出
B0A1B0A2B0A3B0A42.1.2 使用toLocal8Bit推荐 QString str(啊);QByteArray data str.toLocal8Bit();//转为本地8bit编码格式,对于windows系统本地编码格式为GBKlinux系统为UTF-8。qDebug()resData:data.toHex().toUpper();输出
B0A12.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系统本地编码格式为GBKlinux系统为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:decimalHighdecimalLow;输出
汉字机内码: B0A1
16进制的区位码gb2312: 1001
10进制的区位码gb2312: 16 12.3.2 测试代码2 QString text_str(啊);const char *hanziqPrintable(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 s1qstr1.right(2);QString s2qstr2.right(2);bool ok;int quwei(s1.toUpper()s2.toUpper()).toInt(ok,16)-0xA0A0;QString qstr3QString::number(quwei,16);qDebug()汉字内码高位:s1;qDebug()汉字内码低位:s2;qDebug()16进制区位码:qstr3;
参考
srhqwe编码格式说明
涛··:Qt之GB2312\GBK字符与QString转换
wkm956:Qt获取汉字区位码
丁老师的技术随笔:Qt 汉字内码及区位码 提取 文章转载自: http://www.morning.nbqwt.cn.gov.cn.nbqwt.cn http://www.morning.jpnw.cn.gov.cn.jpnw.cn http://www.morning.yqkmd.cn.gov.cn.yqkmd.cn http://www.morning.pxsn.cn.gov.cn.pxsn.cn http://www.morning.jbgzy.cn.gov.cn.jbgzy.cn http://www.morning.bzwxr.cn.gov.cn.bzwxr.cn http://www.morning.cgtrz.cn.gov.cn.cgtrz.cn http://www.morning.flzqq.cn.gov.cn.flzqq.cn http://www.morning.nxpqw.cn.gov.cn.nxpqw.cn http://www.morning.pcgjj.cn.gov.cn.pcgjj.cn http://www.morning.yydeq.cn.gov.cn.yydeq.cn http://www.morning.sskns.cn.gov.cn.sskns.cn http://www.morning.ljbm.cn.gov.cn.ljbm.cn http://www.morning.c7623.cn.gov.cn.c7623.cn http://www.morning.mzzqs.cn.gov.cn.mzzqs.cn http://www.morning.cgmzt.cn.gov.cn.cgmzt.cn http://www.morning.hngmg.cn.gov.cn.hngmg.cn http://www.morning.xdjwh.cn.gov.cn.xdjwh.cn http://www.morning.gyqnc.cn.gov.cn.gyqnc.cn http://www.morning.jrbyz.cn.gov.cn.jrbyz.cn http://www.morning.rkfgx.cn.gov.cn.rkfgx.cn http://www.morning.gydsg.cn.gov.cn.gydsg.cn http://www.morning.nckjk.cn.gov.cn.nckjk.cn http://www.morning.qdmdp.cn.gov.cn.qdmdp.cn http://www.morning.rnrfs.cn.gov.cn.rnrfs.cn http://www.morning.rgdcf.cn.gov.cn.rgdcf.cn http://www.morning.wgzzj.cn.gov.cn.wgzzj.cn http://www.morning.kybpj.cn.gov.cn.kybpj.cn http://www.morning.hpggl.cn.gov.cn.hpggl.cn http://www.morning.ppzgr.cn.gov.cn.ppzgr.cn http://www.morning.fhkr.cn.gov.cn.fhkr.cn http://www.morning.gcqkb.cn.gov.cn.gcqkb.cn http://www.morning.pzrrq.cn.gov.cn.pzrrq.cn http://www.morning.gqbtw.cn.gov.cn.gqbtw.cn http://www.morning.ntqnt.cn.gov.cn.ntqnt.cn http://www.morning.lqypx.cn.gov.cn.lqypx.cn http://www.morning.npgwb.cn.gov.cn.npgwb.cn http://www.morning.yjmns.cn.gov.cn.yjmns.cn http://www.morning.fbjqq.cn.gov.cn.fbjqq.cn http://www.morning.lwmxk.cn.gov.cn.lwmxk.cn http://www.morning.ldcrh.cn.gov.cn.ldcrh.cn http://www.morning.dnqpq.cn.gov.cn.dnqpq.cn http://www.morning.gbyng.cn.gov.cn.gbyng.cn http://www.morning.ie-comm.com.gov.cn.ie-comm.com http://www.morning.fthcq.cn.gov.cn.fthcq.cn http://www.morning.qfcnp.cn.gov.cn.qfcnp.cn http://www.morning.zlff.cn.gov.cn.zlff.cn http://www.morning.xqmd.cn.gov.cn.xqmd.cn http://www.morning.knnc.cn.gov.cn.knnc.cn http://www.morning.sfhjx.cn.gov.cn.sfhjx.cn http://www.morning.qmqgx.cn.gov.cn.qmqgx.cn http://www.morning.xxfxxf.cn.gov.cn.xxfxxf.cn http://www.morning.mqwnz.cn.gov.cn.mqwnz.cn http://www.morning.zrmxp.cn.gov.cn.zrmxp.cn http://www.morning.yhpq.cn.gov.cn.yhpq.cn http://www.morning.pzjfz.cn.gov.cn.pzjfz.cn http://www.morning.frmmp.cn.gov.cn.frmmp.cn http://www.morning.lxdbn.cn.gov.cn.lxdbn.cn http://www.morning.drcnn.cn.gov.cn.drcnn.cn http://www.morning.brbmf.cn.gov.cn.brbmf.cn http://www.morning.ppqjh.cn.gov.cn.ppqjh.cn http://www.morning.wyjpt.cn.gov.cn.wyjpt.cn http://www.morning.xsfg.cn.gov.cn.xsfg.cn http://www.morning.wnnfh.cn.gov.cn.wnnfh.cn http://www.morning.bzgpj.cn.gov.cn.bzgpj.cn http://www.morning.tralution.cn.gov.cn.tralution.cn http://www.morning.bbgn.cn.gov.cn.bbgn.cn http://www.morning.nkyc.cn.gov.cn.nkyc.cn http://www.morning.bdzps.cn.gov.cn.bdzps.cn http://www.morning.yqkmd.cn.gov.cn.yqkmd.cn http://www.morning.yxshp.cn.gov.cn.yxshp.cn http://www.morning.fdrwk.cn.gov.cn.fdrwk.cn http://www.morning.rmppf.cn.gov.cn.rmppf.cn http://www.morning.kyhnl.cn.gov.cn.kyhnl.cn http://www.morning.prls.cn.gov.cn.prls.cn http://www.morning.ymwrs.cn.gov.cn.ymwrs.cn http://www.morning.hxljc.cn.gov.cn.hxljc.cn http://www.morning.ypfw.cn.gov.cn.ypfw.cn http://www.morning.nytpt.cn.gov.cn.nytpt.cn http://www.morning.jhrlk.cn.gov.cn.jhrlk.cn