乱码原因:

QT使用的是utf-8

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

多字节ANISGB

宽字符UNICODE

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

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

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

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

多字节的结束符就是0x00

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

解决办法:

//字符串长度

int len;

QStringList str_list;

//excel的第一列内容

for(int i = 0; i < 14; i ++)

{

str_list  << pPages[i].str;

}

str_list  << "Root密码暗文";

QTextCodec *codec =QTextCodec::codecForName("UTF-8");

//QTextCodec *codec =QTextCodec::codecForLocale();

//sheet->Cell(0,1)->SetInteger(0);

for(size_t i = 0; i < 15; i++)

{

QString str = codec->toUnicode(str_list.at(i).toStdString().c_str());

wchar_t wstr[20];

len = str.toWCharArray(wstr);

//添加字符串结束符

wstr[len] = 0;

sheet->Cell(i,1)->SetInteger(1);

sheet->Cell(i,0)->SetWString(wstr);

}

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

关键代码是:

QTextCodec *codec =QTextCodec::codecForName("UTF-8"); //1

QString str = codec->toUnicode(str_list.at(i).toStdString().c_str());//2

len = str.toWCharArray(wstr);//3

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个字节来表示一个字符,而不是一个字节表示一个字符,否则会乱码。

http://blog.csdn.net/u013281495/article/details/51049646

qt宽字符串中文乱码(codec->toUnicode值得学习)的更多相关文章

  1. springmvc返回json字符串中文乱码问题

    问题: 后台代码如下: @RequestMapping("menuTreeAjax") @ResponseBody /** * 根据parentMenuId获取菜单的树结构 * @ ...

  2. SpringMvc @ResponseBody字符串中文乱码原因及解决方案

    今天突然发现一个问题,后来在网上也找到了很多解决思路,自己也查找到了问题所在,记录一下. @RequestMapping(value = "/demo1") @ResponseBo ...

  3. 解决springmvc使用@ResponseBody返回String类型字符串中文乱码问题

    问题分析: 首先: 确定的是只有当返回值是 String时才会出现中文乱码,而当返回值是Map<String, Object>或者是其它类型时,并没有中文乱码的出现. 然后找原因: 原因是 ...

  4. byte[] 转字符串 中文乱码

    闲来无事,写了一个UWP的UDP/TCP小Demo,网上找了个网络调试助手,就兴冲冲的开始玩耍 结果“鸡同鸭讲”: 讲英文的时候大家都是abc,hello man!how are you? 讲中文的时 ...

  5. SpringMVC 学习-返回字符串中文乱码问题解决

    一.使用 SpringMVC 框架时,如果 HTTP 请求资源返回的是中文字符串,则会出现乱码.原因如下: SpringMVC 框架可以使用 @RequestBody 和 @ResponseBody ...

  6. java 检测字符串中文乱码

    1.检测是否为乱码 public static boolean isMessyCode(String strName) { Pattern p = Pattern.compile("\\s* ...

  7. qt cout输出中文乱码解决记录

    工具 -> 选项-> 文本编辑器-> 行为 -> 文件编码->默认编码改为System 乱码原因: 默认用utf-8编码,控制台默认gbk编码,编码不一致导致的乱码

  8. QT MSVC编译中文乱码问题

    两种解决方案: 1,在文件头添加 #if _MSC_VER >= 1600 #pragma execution_character_set("utf-8") #endif 注 ...

  9. QT中文乱码与国际化支持

      QT国际化支持 Qt内部采用的全Unicode编码,这从根本上保证了多国语界面实现的正确性和便捷性.Qt本身提供的linguist工具,用来实现翻译过程十分方便.MFC中利用资源DLL切换资源,或 ...

随机推荐

  1. hdu 1565&&hdu 1569 (最大点权独立集)

    题目意思很明确就是选一些没有相连的数字,使和最大,建成二分图后求最大点权独立集,, #include<stdio.h> #include<string.h> const int ...

  2. c++空指针调用类成员函数

    最近在看C++动态绑定问题时(理解静态绑定时)发现的问题:能用空指针调用类的成员函数(gcc,vs2013下都可以). 例子: class animal { public: void sleep(){ ...

  3. Java开发中常见的危险信号(上)

    本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...

  4. 架构漫谈:自己开发一个Log框架

    前言 在日常开发中我们常常都会用到写日志的功能,现在网上的写Log的框架有很多,但是对于我个人而言,过于庞大:我们往往只为了使用框架中的某一个功能就不得不引用整个框架. 所以,我们今天就来自己动手开发 ...

  5. Android解析Excel文档完整示例

    MainActivity如下: package cc.testexcel; import java.io.File; import jxl.Cell; import jxl.CellType; imp ...

  6. RTSP调试代码

    #ifdef _WIN32_WCE #include "stdafx.h" #endif #ifndef _WIN32_WCE #define WIN32_LEAN_AND_MEA ...

  7. JS中setTimeout()的使用方法具体解释

    1. SetTimeOut()              1.1 SetTimeOut()语法样例              1.2 用SetTimeOut()运行Function           ...

  8. Ajax Post提交事例及SpringMVC注解@RequestMapping取不到参数值解决办法

    var xmlHttp; //定义变量,用来创建xmlHttp对象 function ajaxfunction(url,onreadystatechangMethod,param){ // 创建xml ...

  9. mysql数据导出权限问题

    mysql数据导出的方法有非常多,比如mysqldump, mysql -e 'sql' > file, 这些都能够非常方便的导出数据,但是在使用普通用户导出数据的时候,出现了问题. 1 sel ...

  10. N使用exus2打造企业maven仓库(三)

    假设项目中,我没有使用maven,我应该做出选择,或为项目.或者用它来推动这个项目从maven.有人会问,为什么maven?无需maven我们没有很好的操作. 这里,只说两件事情我最欣赏:第一点是管理 ...