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

【Qt-编码】

Qt编程指南

  • ■ 编码
    • ■ ASCII
    • ■ ANSI
    • ■ GB2312
    • ■ GBK
    • ■ GB18030 编码
    • ■ Unicode
    • ■ UTF-8:
  • ■ Qt接收注射泵GBK编码后显示乱码

■ 编码

■ ASCII

(American Standard Code for Information Interchange,美国信息交换标准代码)
使用7位(bits)表示一个字符,共128字符;但是7位编码的字符集只能支持128个字符,为了表示更多的欧洲常用字符对ASCII进行了扩展,ASCII扩展字符集使用8位(bits)表示一个字符,共256字符。
Latin-1:(相当于ASCII+标准的扩展ASCII)
即ISO-8859-1的别名,编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。比ASC多了西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。所以中文字符会显示为是西欧等字符"ÎÒÊÇ"

■ ANSI

不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准。
这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。
在简体中文Windows操作系统中,ANSI 编码代表 GB2312编码;
在繁体中文Windows操作系统中,ANSI编码代表Big5;
在日文Windows操作系统中, ANSI 编码代表 JIS 编码。
不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。
ANSI编码表示英文字符时用一个字节,表示中文用两个或四个字节。

■ GB2312

GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;
GB2312对任意一个图形字符都采用两个字节表示,并对所收汉字进行了“分区”处理,每区含有94个汉字/符号,分别对应第一字节和第二字节。
对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK 及GB18030 汉字字符集的出现。

■ GBK

GBK全称《汉字内码扩展规范》 中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订
GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1国际标准
GBK共收入21886个汉字和图形符号。
GBK采用双字节表示,总体编码范围为8140-FEFE之间,首字节在81-FE之间,尾字节在40-FE之间。

■ GB18030 编码

与 GBK 不同的是,GB18030 是变长多字节字符集,每个字或字符可以由一个,两个或四个字节组成,所以它的编码空间是很大的,最多可以容纳 161 万个字符
由于需要兼容 GBK,四个字节的前两个字节和 GBK 编码保持一致,GB18030 具体的编码范围如下

// GBK编码和UTF-8编码互相转换的函数。返回值是QString, 验证ok

inline QString GBK2UTF8(QByteArray &inStr)
{QTextCodec *gbk = QTextCodec::codecForName("gbk");QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");char *p = inStr.data();QString str = gbk->toUnicode(p);QByteArray utf8_bytes=utf8->fromUnicode(str);p = utf8_bytes.data();str = p;return str;
}inline QString UTF82GBK(QByteArray &inStr)
{QTextCodec *gbk = QTextCodec::codecForName("gbk");QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");char *p = inStr.data();QString str = utf8->toUnicode(p);QByteArray utf8_bytes=gbk->fromUnicode(str);p = utf8_bytes.data();str = p;return str;
}
//根据上面代码优化 实现和云平台对接不乱码问题。
/*将GBK编码转换成UTF-8编码,返回值是QString*/
//说明 m_realdata.drugname[20] 是泵的GBK编码。
QByteArray gdkStr((char*)m_realdata.drugname);
QTextCodec *gbk = QTextCodec::codecForName("gbk");
QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");
QString gbkstring = gbk->toUnicode(gdkStr);
QByteArray utf8_bytes=utf8->fromUnicode(gbkstring);
return utf8_bytes; 
//GBK‐> QString  unicode
uint8_t utf8[] = {0xCA ,0xB9, 0xD3, 0xC3, 0xCA, 0xE4, 0xD2 ,0xBA, 0xC6, 0xF7, 0x3A, 0x57, 0x45, 0x49, 0x47, 0x41, 0x4F};
QString str2 = QString::fromLocal8Bit((char*)utf8);  //QT默认的编码是unicode,不能显示中文的 实现了从本地字符集GBK到Unicode的转换,
qDebug() << str2 << endl; //使用输液器:WEIGAO //stFrame->data[5] 是GB2312 十六进制数据,通过一下转写入到U盘文件中,可以查看不乱码。
QString recordData = QString::fromLocal8Bit((const char*)&stFrame->data[5],stFrame->head.len-5); //实现了从本地字符集GBK到Unicode的转换,/*末尾添加*/
void CsvFile::tailAppendCsvLine(QString &content)
{file.atEnd();content += \n;file.write(content.toLocal8Bit().data()); 、、写入文件后可以显示中文file.flush();
}
QString qstr;
QByteArray qbytea1 = qstr.toLatin1();    //Latin1代表ASCII  ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF。亦称为Latin1。
QByteArray qbytea2 = qstr.toUtf8();      //utf8字符集以2个或以上的字节表示一个汉字。
QByteArray qbytea3 = qstr.toLocal8Bit(); //Local8Bit代表unicode unicode字符集以2个或以上的字节表示一个汉字。
QString(const char *str)   //char*字符串,默认这个字符串是以utf-8编码的.
QString::fromUtf8  QString s1 = u8中国;
QString s2 = QString::fromUtf8(u8中国);
std::string stdS = u8中国;
QString s3 = QString::fromStdString(stdS); //QString::fromStdString也是将std::string中的字符串当做utf-8编码来处理的。
qDebug() << s1 << s2  << s3  << endl;  //中国 中国 中国 /* 转换为字节数组 */
QString s1 = "我是中文";
QString s2("我是中文");
QString s3;
s3 = "我是中文"
s1、s2 用的是QString的构造函数QString ( const char * str )
s3 用的是QString的赋值操作符 QString & operator= ( const char * str)如果不指定编码,s1,s2,s3将全部都是(国内大多数人所称的)乱码。因为QString将这些const char *按照latin1来解释的,而不是用户期待的gbk或utf8。QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"))

■ Unicode

Unicode只是一种编码规范,而实现方式就有:utf8,utf16,utf32等。
Unicode是一种字符编码,它为每个字符分配了一个唯一的数字,无论平台、程序或语言如何,都可以使用相同的数字来表示该字符。Unicode支持超过100,000个字符,包括世界上所有的语言、符号和表情。Unicode编码通常用于国际化应用程序和网站,以确保它们可以在全球范围内使用。

■ UTF-8:

UTF-8是一种Unicode编码方式,它使用1到4个字节来表示每个字符。UTF-8是一种变长编码方式,它可以表示Unicode标准中的任何字符,而且也是互联网上最常用的编码方式之一。

■ Qt接收注射泵GBK编码后显示乱码

//QTextCodec 可以用于将一些本地编码的字符串转换为 Unicode
QByteArray encodedString = "中国";
QTextCodec *codec = QTextCodec::codecForName("GBK");
QString string = codec->toUnicode(encodedString);  //将 encodedString为GBK编码转换成Unicode编码.//将字符串从 Unicode 转换为本地编码:QString string = "中国";QTextCodec *codec = QTextCodec::codecForName("GBK");QByteArray encodedString = codec->fromUnicode(string); //将 string为Unicode编码转换成GBK编码.示例一:/*正确GBK转换Unicode*/
QTextCodec *codec = QTextCodec::codecForName("GBK");
QString stre = codec->toUnicode((char*)ps.name);
QString strd = codec->toUnicode((char*)ps.department);
QString strh = codec->toUnicode((char*)ps.hospnum);
sethospnum(stre);    //中国
setdepartment(strd); //中国
setbedname(strh);    //中国/*乱码*/
QString qhospnum(QString::fromLocal8Bit((char*)ps.hospnum,MAX_NAME_LENGTH));
QString qdepartment(QString::fromLocal8Bit((char*)ps.department,MAX_NAME_LENGTH));
QString qname(QString::fromLocal8Bit((char*)ps.name,MAX_PATIN_NAME_LENGTH));
setname(qname);         //乱码
setweight(qdepartment); //乱码
setBMI(qhospnum);       //乱码/*正确Unicode转换 GBK*/
QTextCodec *codec = QTextCodec::codecForName("GBK");
QByteArray Array1 =codec->fromUnicode(hospnum());
memcpy(pfors.hospnum,Array1.data(),qMin(Array1.size(),MAX_NAME_LENGTH));QByteArray Array2 =codec->fromUnicode(department());
memcpy(pfors.department,Array2.data(),qMin(Array2.size(),MAX_NAME_LENGTH));QByteArray Array3 =codec->fromUnicode(name());
memcpy(pfors.name,Array3.data(),qMin(Array3.size(),MAX_PATIN_NAME_LENGTH));



相关文章:

  • 中北大学 软件构造 U+及上课代码详解
  • winlogbeat收集Windows事件日志传给ELK
  • 详细讲解Java8中的forEach()用法
  • html旋转相册
  • 『CVE』简析CVE-2023-48795:SSH协议前缀截断攻击(Terrapin攻击)
  • 【python】Ubuntu下安装spyder及matplotlib中文显示
  • 分布式锁常见问题及其解决方案
  • Elasticsearch基本使用
  • hive中array相关函数总结
  • 验证码服务使用指南
  • 算法基础之最长公共子序列
  • 基于Python的新能源汽车销量分析与预测系统
  • 前端学习笔记
  • 平衡二叉树的构建(递归
  • 【WPF.NET开发】数据绑定应用场景
  • 【翻译】babel对TC39装饰器草案的实现
  • express + mock 让前后台并行开发
  • Lucene解析 - 基本概念
  • mac修复ab及siege安装
  • maven工程打包jar以及java jar命令的classpath使用
  • mysql常用命令汇总
  • nfs客户端进程变D,延伸linux的lock
  • Redis 中的布隆过滤器
  • Sequelize 中文文档 v4 - Getting started - 入门
  • V4L2视频输入框架概述
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 前端自动化解决方案
  • 深入浅出Node.js
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • mysql面试题分组并合并列
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • # 达梦数据库知识点
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (1)Android开发优化---------UI优化
  • (2)(2.10) LTM telemetry
  • (4)事件处理——(7)简单事件(Simple events)
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Java数据结构)ArrayList
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (十六)串口UART
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NetCore部署微服务(二)
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • /bin/rm: 参数列表过长"的解决办法
  • @RestController注解的使用
  • [20170728]oracle保留字.txt
  • [Android Pro] AndroidX重构和映射