一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

乱码原因:

QT使用的是utf-8

简体中文版的windows操作系统及其应用软件默认都是ANSI/GBK编码。而且这里应该是宽字符串。

多字节ANISGB

宽字符UNICODE

多字节显示标准字符的时候,十六进制编码对应的ASCILL编码就是标准字符。

宽字符如UNICODE显示标准字符的时候,会在前面(高位)补零。

 

多字节显示汉字的时候,会看前面一个字节的值,如果这个值大于0x7F那么就会把后面的若干个字节看做是一个字符,比如GB是把本字节和后面的一个字节拿来看做一个字符来显示。UTF-8会把后面的不定个字节拿来当一个字符显示。

宽字符显示汉字时,直接把两个字节的信息看做一个字符拿来显示。

 

多字节的结束符就是0x00

宽字节的结束符必须是两个连续的0x00才会结束。

 

解决办法:

复制代码
 1        //字符串长度
 2         int len;
 3         QStringList str_list;
 4         //excel的第一列内容
 5         for(int i = 0; i < 14; i ++)
 6         {
 7             str_list  << pPages[i].str;
 8         }
 9         str_list  << "Root密码暗文";
10 
11         QTextCodec *codec =QTextCodec::codecForName("UTF-8");
12         //QTextCodec *codec =QTextCodec::codecForLocale();
13        //sheet->Cell(0,1)->SetInteger(0);
14 
15         for(size_t i = 0; i < 15; i++)
16         {
17             QString str = codec->toUnicode(str_list.at(i).toStdString().c_str());
18             wchar_t wstr[20];
19             len = str.toWCharArray(wstr);
20             //添加字符串结束符
21             wstr[len] = 0;
22             sheet->Cell(i,1)->SetInteger(1);
23             sheet->Cell(i,0)->SetWString(wstr);
24         }
复制代码

总结:(自己的理解,不知道是否有错)

关键代码是:

1 QTextCodec *codec =QTextCodec::codecForName("UTF-8"); //1
2 QString str = codec->toUnicode(str_list.at(i).toStdString().c_str());//2
3 len = str.toWCharArray(wstr);//3
4 sheet->Cell(i,0)->SetWString(wstr);//4

这样就解决了,注意,第二句是从utf-8(qt本身编码方式)转化为unicode,因为utf-8是变长字节数表示字符的,unicode是2字节表示;第三句的作用不是unicode转化为宽字符串,字节数据本身没有产生变化,只是把字节数据组织成一个宽字符数组,然后返回宽字符串的长度,最后把这个宽字符串传递给basic excel库的SetWString函数,也就是sheet->Cell(i,0)->SetWString(wstr);这样,因为excel用2个字节来表示一个字符,而不是一个字节表示一个字符,否则会乱码。

posted on   一杯清酒邀明月  阅读(909)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2020-02-21 C++ 回调函数简单示例
2020-02-21 Qt HWND的句柄与QWidget的转换
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示