乱码原因:

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. C Tips:显示点阵汉字的小样例

    非常简陋的一段小程序,演示怎样显示点阵字库.有时间的时候再详解. #include <stdio.h> #include <stdlib.h> struct HzkInfoSt ...

  2. 安装apk程序进android

    package com.example.installmyapk; import java.io.File; import android.net.Uri; import android.os.Bun ...

  3. iOS 7 - Auto Layout on iOS Versions prior to 6.0

    链接地址:http://stackoverflow.com/questions/18735847/ios-7-auto-layout-on-ios-versions-prior-to-6-0 Stac ...

  4. 关于 Swift

    摘自:http://numbbbbb.gitbooks.io/-the-swift-programming-language-/chapter1/01_swift.html Swift 是一种新的编程 ...

  5. HTML5给我们带来了什么

    websocket 根据维基定义 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端直接向客户端推送数据而不需要客户端进行请求,在 WebSocket API 中,浏览器和服 ...

  6. 分享非常有用的Java程序 (关键代码) (一)

    原文:分享非常有用的Java程序 (关键代码) (一)   分享一些非常有用的Java程序 (关键代码) ,希望对你有所帮助. 1.  得到当前方法的名字 String methodName = Th ...

  7. 在SSH框架中使用Spring的好处(转)

    以下是我总结下今天笔试中SSh中的总结: 在SSH框架中spring充当了管理容器的角色.我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不 ...

  8. 用ATL写简单的ActiveX控件 .

    我正在做的项目需要用读卡器来读数据,由于系统是B/S架构的所以只能把读卡器的驱动封装成一个无界面的ActiveX控件,这样web页面中的js代码才能访问读卡器其实做起来也挺简单的,我用的环境是VS20 ...

  9. SqlServer和Oracle中一些常用的sql语句6 存储过程

    --不带参数的存储过程 CREATE procedure proc_sql1 as begin declare @i int set @i=0 while @i<26 begin print c ...

  10. Android开发10.1:UI组件适配器AdapterView(创建ListView,Adapter接口)

    @version:Android4.3 API18 @author:liuxinming 概述               AdapterView继承了ViewGroup,它的本质是容器       ...