当前位置:   article > 正文

C++QT5跨平台界面编程原理--QString字符串处理及中文乱码问题处理_qt5 qsetting 写ini文件包含中文的字符串乱码

qt5 qsetting 写ini文件包含中文的字符串乱码

 

gbk_utf_ansi_asc字符集分析字节序

字符集

●ASCII的7位字符集128个字符

●标准ASCII中最高位(b7)用作奇偶校验1个数

●IS0-8859-1 扩展ASCII 128-255拉丁

ANSI标准

●AmericanNational Standards Institute美国国家标准学会
●多字节字符集(MBCS , Multi- ByteChactacter Set)
0到127之间的字符,依旧是1个字节代表1个字符
●(超出部分)2个字节来表示1个字符

GB2312 GBK编码
●ANSI编码6763常用汉字
●两个大于127的字符表示一个汉字
●GBK编码GB2312的扩展汉字21003个

UTF-8

●变长的编码方式
●单字节与ASCII码相同
●对于n字节的符号( n>1 )首字节前n位为1,n+ 1为0,后面字节前两位都为10

UTF-16 UTF-32



字节序BOM
●LE ( littleendian):小字节字节序低位在前
●0x001A23    低地址23 1A 00高地址
●BE ( big endian):大字节字节序
●BOM字节序标志头
●文本头FE FF是BE               FF FE是LE

QString项目创建空和NULL判断

QString

●16-bit QChars ushort Unicode 4.0
封装了字符串处理功能
●空判断==' 'isNull isEmpty
●字符串拼接+=
●格式化字符串%1 %2 arg()

  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. int main(int argc, char *argv[])
  4. {
  5. QCoreApplication a(argc, argv);
  6. QString str;
  7. if(str.isNull()) //判断是否为空
  8. {
  9. qDebug()<<"isNull"<<endl;
  10. }
  11. if(str.isEmpty())
  12. {
  13. qDebug()<<"isEmpty"<<endl;
  14. }
  15. str = "";
  16. if(str.isNull())
  17. {
  18. qDebug()<<"isNull2"<<endl;
  19. }
  20. if(str.isEmpty())
  21. {
  22. qDebug()<<"isEmpty2"<<endl;
  23. }
  24. QString str2;
  25. if(str2 == "")
  26. {
  27. qDebug()<<"str2 isNULL"<<endl;
  28. }
  29. QString str3 = "test1"; //拼接
  30. str3 += "test2";
  31. str3 += 'A';
  32. str3.append("test3");
  33. qDebug()<<str3;
  34. QString str4("test4");
  35. qDebug()<<str4;
  36. return a.exec();
  37. }

QString格式化字符串转换

  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. int main(int argc, char *argv[])
  4. {
  5. QCoreApplication a(argc, argv);
  6. QString str;
  7. str = QString("name=%1 arg=%2 %3 %4 %5") //字符串拼接
  8. .arg("xiaoming")
  9. .arg(15)
  10. .arg(14.5)
  11. .arg(123,0,2) //数,宽度,2进制
  12. .arg(255,6,16) //数,宽度,16进制
  13. ;
  14. qDebug()<<str;
  15. QString num = QString::number(14); //数转字符串
  16. qDebug()<<num;
  17. int i = num.toInt(); //字符串转整数
  18. qDebug()<<"i="<<i;
  19. qDebug()<<"num double"<<num.toDouble();
  20. QString num2 = QString::number(15.6);
  21. qDebug()<<num2;
  22. qDebug()<<num2.toInt();
  23. qDebug()<<num2.toDouble();
  24. return a.exec();
  25. }

遍历字符串

  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. #include <iostream>
  4. using namespace std;
  5. int main(int argc, char *argv[])
  6. {
  7. QCoreApplication a(argc, argv);
  8. QString str = "xcjasd,asdasd{,[name],[id]},[name]},asda[name]}sdsa";
  9. ///
  10. //字符串遍历
  11. for(int i =0; i < str.size(); i++)
  12. {
  13. cout<<str[i].toLatin1();
  14. }
  15. cout<<endl;
  16. cout<<"========================\n";
  17. QString::iterator itr = str.begin();
  18. for(;itr!= str.end();itr++)
  19. {
  20. //(*itr).toLatin1();
  21. cout<<itr->toLatin1();
  22. }
  23. cout<<endl;
  24. ///
  25. //字符串查找
  26. QString key = "[name]";
  27. int pos = str.indexOf(key);
  28. cout<<"pos = "<<pos<<endl;
  29. int pos2 = str.indexOf(key,pos+key.size());//在某个位置之后,再查找
  30. cout<<"pos2 = "<<pos2<<endl;
  31. int pos3 = str.indexOf(key,pos2+key.size());
  32. cout<<"pos3 = "<<pos3<<endl;
  33. cout<<str.indexOf("tttt"); //找不到返回-1
  34. ///
  35. //字符串截取
  36. //str.chop(2);//去掉字符串最后两个字符
  37. qDebug()<<str;
  38. //取第一个{括号之前 012{56}9
  39. int bpos = str.indexOf("{");
  40. int epos = str.lastIndexOf("}");
  41. qDebug()<<str.left(bpos); //之前的几个字符
  42. //取最后一个}括号之后123456789
  43. qDebug()<<str.right(str.size()-epos-1);//之后的几个字符
  44. //取括号之间
  45. QString str2 = str;
  46. str2.chop(str.size()-epos); //截取
  47. qDebug()<<str2;
  48. qDebug()<<str2.right(epos-bpos-1);
  49. ///
  50. //字符串替换
  51. str.replace("[name]","xiaoming");
  52. str.replace("[id]","007");
  53. qDebug()<<str;
  54. ///
  55. //字符串切割 , csv
  56. QStringList list1 = str.split(",");
  57. cout<<"---------------------"<<endl;
  58. for(int i = 0; i<list1.size();i++)
  59. {
  60. qDebug()<<list1[i];
  61. }
  62. return a.exec();
  63. }#include <QCoreApplication>
  64. #include <QDebug>
  65. #include <iostream>
  66. using namespace std;
  67. int main(int argc, char *argv[])
  68. {
  69. QCoreApplication a(argc, argv);
  70. QString str = "xcjasd,asdasd{,[name],[id]},[name]},asda[name]}sdsa";
  71. ///
  72. //字符串遍历
  73. for(int i =0; i < str.size(); i++)
  74. {
  75. cout<<str[i].toLatin1();
  76. }
  77. cout<<endl;
  78. cout<<"========================\n";
  79. QString::iterator itr = str.begin();
  80. for(;itr!= str.end();itr++)
  81. {
  82. //(*itr).toLatin1();
  83. cout<<itr->toLatin1();
  84. }
  85. cout<<endl;
  86. ///
  87. //字符串查找
  88. QString key = "[name]";
  89. int pos = str.indexOf(key);
  90. cout<<"pos = "<<pos<<endl;
  91. int pos2 = str.indexOf(key,pos+key.size());//在某个位置之后,再查找
  92. cout<<"pos2 = "<<pos2<<endl;
  93. int pos3 = str.indexOf(key,pos2+key.size());
  94. cout<<"pos3 = "<<pos3<<endl;
  95. cout<<str.indexOf("tttt"); //找不到返回-1
  96. ///
  97. //字符串截取
  98. //str.chop(2);//去掉字符串最后两个字符
  99. qDebug()<<str;
  100. //取第一个{括号之前 012{56}9
  101. int bpos = str.indexOf("{");
  102. int epos = str.lastIndexOf("}");
  103. qDebug()<<str.left(bpos); //之前的几个字符
  104. //取最后一个}括号之后123456789
  105. qDebug()<<str.right(str.size()-epos-1);//之后的几个字符
  106. //取括号之间
  107. QString str2 = str;
  108. str2.chop(str.size()-epos); //截取
  109. qDebug()<<str2;
  110. qDebug()<<str2.right(epos-bpos-1);
  111. ///
  112. //字符串替换
  113. str.replace("[name]","xiaoming");
  114. str.replace("[id]","007");
  115. qDebug()<<str;
  116. ///
  117. //字符串切割 , csv
  118. QStringList list1 = str.split(",");
  119. cout<<"---------------------"<<endl;
  120. for(int i = 0; i<list1.size();i++)
  121. {
  122. qDebug()<<list1[i];
  123. }
  124. return a.exec();
  125. }

QString正则表达式

  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. int main(int argc, char *argv[])
  4. {
  5. QCoreApplication a(argc, argv);
  6. QString str = "xcxjxcxc123asdasdas 345 asdasd";
  7. int pos = str.indexOf(QRegExp("[0-9]+"));
  8. qDebug()<<pos<<endl;
  9. QString str2 = str;
  10. str2.replace(QRegExp("[0-9]+") ,"[num]");
  11. qDebug()<<str2<<endl;
  12. QStringList rlist = str.split(QRegExp("[0-9]+"));
  13. for(int i = 0; i < rlist.size(); i++)
  14. {
  15. qDebug()<<rlist[i];
  16. }
  17. return a.exec();
  18. }

Qt中文乱码问题在vs项目中显示中文 

1:在vs下源码是gb2312的所以要转换。 

  1. QApplication a(argc, argv);
  2. QString str = QStringLiteral("中文测试"); //QString 内部是utf-16 参数是utf-8 所以
  3. // QStringLiteral转成utf-8
  4. QMessageBox::information(0, "title", str);

 

2.解决办法

vs:文件-》高级保存-》

 

或者::::::这样

3.

  1. #include "vs_cn_codec.h"
  2. #include <QtWidgets/QApplication>
  3. #include <QDebug>
  4. #include <QMessageBox>
  5. #include <iostream>
  6. #include <QTextCodec>
  7. #include <windows.h>
  8. using namespace std;
  9. int main(int argc, char *argv[])
  10. {
  11. char *src = "元数据中文GBK";
  12. //元数据是gbk或者gb2312 多字节存入QString
  13. //本地编码方式 默认GBK
  14. QString str1 = QString::fromLocal8Bit(src); //本地的转成utf-8
  15. qDebug() << "str1 = " << str1;
  16. //把QString 转为gbk
  17. cout << str1.toLocal8Bit().toStdString() << endl; //cout用的是gbk
  18. //本地处理编码方式,默认是GBK,改为UTF-8
  19. //QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
  20. //win api调用qstring作为参数
  21. MessageBox(0, str2.toStdWString().c_str(), L"中文标题",0); //宽字符
  22. //vs_cn_codec w;
  23. //w.show();
  24. return a.exec();
  25. }
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号