QT+VS编译器处理字符串时的坑真是多

以下因素都有影响:
1. QT4与QT5对字符串编码的处理不同(最好不要在源代码里直接写中文,坑更多)
2. QTextCodec自动对编码转换的影响
3. 源代码文件对编码存储格式的不同会影响编译器对字符串的理解
4. 不同版本编译器对源代码文件的理解不同,比如VC6和VC2005的不同,比如VS2010的pragma指令,更不用说MinGW与VC编译器的不同。
5. 也就是我今天碰到的,VS输出调试器对字符串编码的影响。以下代码在单步调试状态下读取utf8文件,中文正确,外文特殊字符乱码(其实也不是乱码,但是显示问号),鉴于前面QT的这么多坑,我都已经见怪不怪了。今天意外把打印值显示到界面上,全部正确!看来VS调试器输出部分(尽管用的是qDebug语句)与QT程序对字符串编码的理解也不同。

QTextStream in(&file);
in.setCodec("UTF-8"); // good,写上这个,中文环境下读取中文正确

while(!in.atEnd())
{
    QString line = in.readLine();
    qDebug() << line.toLocal8Bit(); // convert to locale multi-byte string
    strCode = line;
}
file.close();

长叹一声,连最贴心的调试器都不靠谱,只有最终运行程序才靠谱,以后要千万小心。

------------------------------------------------------------------------------

我晕,又有新发现:
VS调试状态,底下左右两片区域,左边选择Watch 1窗口,右边选择Output窗口,同一个qDebug输出值,左边Watch正确,右边Output错误!

各位可以试试,把以下文字存储在utf8文件里(可以带BOM):
zsse中国最好utf8_éçàèöùïë

然后用我的代码读取后,观察Watch和Output的不同输出。

------------------------------------------------------------------------------

PS,我使用的是VS2008 SP1 TEAM 英文版 + 4.86官方版(非自编译版)

时间: 2024-10-13 15:45:59

QT+VS编译器处理字符串时的坑真是多的相关文章

指针指向整数,字符,及字符串时,相应地址取法

指针指向整数时: 1 #include <iostream> 2 3 int main(void) 4 { 5 using namespace std; 6 int a = 10; 7 int *p = &a; 8 9 cout << "sizeof(p) = " << sizeof(p) << endl; 10 cout << "sizeof(&p) = " << sizeof

C#反序列化json字符串时,提示:应为来自命名空间“”的元素“root”。。遇到名称为“”、命名空间为“”的“None”。

反序列化调用接口返回的字符串时,出现:应为来自命名空间“”的元素“root”..遇到名称为“”.命名空间为“”的“None”.,导致反序列化数据失败,这种失败并有时候并不会直接提示反序列化失败(抛异常),而是把不能正常反序列化的部分丢弃(值为null),查了一下网上的资料,有说是使用反序列化和序列化的版本不一致,也有说是命名空间的问题,我检查了貌似都没问题,实在没办法了,直接先实例化一个,序列化后和接口返回的值做比较.终于找到问题出在哪了. 是因为我自己定义的类的属性命是Keys,二接口返回的这

Base64编码字符串时数据量明显变大

那就是当把byte[]通过Convert.ToBase64String转换成Base64编码字符串时数据量明显变大 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24位数据,再把这24位数据分成4组,即每组6位.再在每组的的最高位前补两个0凑足一个字节.这样就把一个3字节为一组的数据重新编码成了4个字节.当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节.这时在最后一组填充1到

C#分隔字符串时遭遇空值

在C#中分隔字符串时,按特定字符进行分隔的时候可能会遇到空值,如何我现在传入的是Id的字符串,如:"1501,1502,1503,,1505",以逗号分隔,由于各种原因,导致传入的字符串中有连续的逗号,如果我要利用这一串字符串得到ID数组作为Sql查询的条件,那么我就必须对这种情况进行处理. 实例: //数组转换成字符串,字符串切割成数组.string[] array = new[] {"1m2", "", "ww", &qu

解决Qt中QTableWidget类方法setItem 时导致程序崩溃问题

在为一个音乐播放器增加功能时莫明奇妙的出现程序崩溃,定位到是由于QTableWidget 的setItem方法导致的,最终在此处找到了解决方式. 大致是说不能在setItem之前连接cellChanged 信号,把连接cellChanged信号的语句放置在一连串的setItem(在表格插入一行后调用的)之后就可以了. 解决Qt中QTableWidget类方法setItem 时导致程序崩溃问题

Spring MVC 返回类型为字符串时, 返回中文变成&quot;?&quot;处理

Spring MVC 返回类型为字符串时, 返回中文变成"?"处理 Spring controller 如下 @Controller public class SimpleController { @ResponseBody @RequestMapping(value = "/hotel") public String hotel() { return "{\"status\":0,\"errmsg\":null,\

使用 springmvc请求 返回 字符串时 ,中文出现乱码

@RequestMapping(value="/askQuestion" ,method = RequestMethod.GET , produces = {"application/json,charset=UTF-8"}) @ResponseBody public String askQuestion(@RequestParam(value="content",required=true)String content, 返回 string .

个人经验 - Android的RelativeLayout布局的layout_height属性设置为wrap_content时的坑

Android的RelativeLayout布局的layout_height属性设置为wrap_content时的坑: 此坑出现的条件: 1.RelativeLayout布局的layout_height属性设置为wrap_content 2.某“居中View”设置为layout_centerX(layout_centerVertical.layout_centerHorizontal.layout_centerInParent) 3.其它View相对于“居中View”做布局 此时坑出现了: 无论

Mysql中使用FIND_IN_SET解决IN条件为字符串时只有第一个数据可用的问题

今天在使用Mysql的存储过程处理数据的批量删除时,遇到了WHERE条件中使用IN(strlist)时(strlist为逗号分隔的字符串),只有strlist的第一个元素才有效的问题,现在将问题和解决方法做下记录. 我们首先创建两张表userinfo(用户信息表)和userextinfo(用户扩展信息表),其中userextinfo表的UserID字段为外键对应userinfo表中的UserID字段 用户信息表userinfo 初始数据 用户扩展信息表userextinfo 初始数据 现在表中有