• 14855阅读
  • 13回复

[讨论]QString::fromWCharArray() 转换不成功,help me! [复制链接]

上一主题 下一主题
离线tzqdo
 
只看楼主 倒序阅读 楼主  发表于: 2011-04-19
    TCHAR Tbuf[256]={0};
    QString s;
    s = QString::fromWCharArray(Tbuf);
    printf("%d\n",s.size());


得到的始终为-1,#QNAN 乱七八糟的,郁闷,求助
[ 此帖被tzqdo在2011-04-19 09:56重新编辑 ]
离线dbzhang800

只看该作者 1楼 发表于: 2011-04-19
不妨贴你完整的测试程序,(最多也不会超过20行吧)。
离线tzqdo
只看该作者 2楼 发表于: 2011-04-19
回 1楼(dbzhang800) 的帖子
void getPos(){
    TCHAR Tbuf[256]={0};
    QString s;
    s = QString::fromWCharArray(Tbuf);  
   //DeviceGetControlResponse(m_dwDevice,Tbuf,255,16);//这句可不管
   //printf("Postion:%s\n",Tbuf);如果把上面一句注释去掉,这句输出结果正确,一个字符串
   printf("%d\n",s.size());
   }
离线dbzhang800

只看该作者 3楼 发表于: 2011-04-19
Re:回 1楼(dbzhang800) 的帖子
引用第2楼tzqdo于2011-04-19 10:02发表的 回 1楼(dbzhang800) 的帖子 :
void getPos(){
    TCHAR Tbuf[256]={0};
    QString s;
    s = QString::fromWCharArray(Tbuf);  
   //DeviceGetControlResponse(m_dwDevice,Tbuf,255,16);//这句可不管
.......

你怀疑 fromWCharArray有问题,就写测试程序单独测试它,不要将一堆东西混到一块去。包括TCHAR,直接用wchar_t 这种准确类型,不用将printf混进来等等

不然,一个小问题足够写一系列分类讨论了:

http://hi.baidu.com/cyclone/blog/item/dcbdb48fcb87b3e1f11f3621.html
http://hi.baidu.com/cyclone/blog/item/25b262d973e9d72111df9bcf.html
离线tzqdo
只看该作者 4楼 发表于: 2011-04-19
不好意思,好像不是qt的问题
void getPos(){
    TCHAR Tbuf[256]={0};
    DeviceGetControlResponse(0,Tbuf,255,16);//这句可不管
    printf("Postion:%s\n",Tbuf);//输出图片里的第一行
    QString s;
    s = QString::fromWCharArray(Tbuf);  
   printf("Postion:%s\n",s.toLatin1().data());//输出图片里的第二行,乱码
   }
    


离线tzqdo
只看该作者 5楼 发表于: 2011-04-19
回 3楼(dbzhang800) 的帖子
谢谢关注,在qt 里面定义了unicode,tchar就是wchar_t吧
离线dbzhang800

只看该作者 6楼 发表于: 2011-04-19
引用第4楼tzqdo于2011-04-19 10:20发表的  :
不好意思,好像不是qt的问题
void getPos(){
    TCHAR Tbuf[256]={0};
    DeviceGetControlResponse(0,Tbuf,255,16);//这句可不管
    printf("Postion:%s\n",Tbuf);//输出图片里的第一行
.......

之所以让你贴完整的程序,就是怕这样。

当你使用wchar_t 和 printf 是,需要注意的是:
* 设置正确的 locale
* 选对 格式控制符
* 注意不同编译器不同的处理方式

题外:
为何要在Qt程序中使用 printf 来处理 wchar_t 呢?不是自找麻烦么?
离线tzqdo
只看该作者 7楼 发表于: 2011-04-19
回 6楼(dbzhang800) 的帖子
为什么使用printf,是因为我要分割Tbuf这个字符串。
思路如下:
方法一.论坛里说mingw对宽字节支持不好(没有深究,表现为wcstok得到的结果始终不正确),然后我就想先把Tbuf转换为char *,即Tchar>>Qstring>>QString::toLatin1().data(),用strtok这个函数分割字符串。如果转换成功了,printf也就没问题了吧
方法二.Tbuf转为QString,直接使用QString::split.

[ 此帖被tzqdo在2011-04-19 10:40重新编辑 ]
离线dbzhang800

只看该作者 8楼 发表于: 2011-04-19
Re:回 6楼(dbzhang800) 的帖子
引用第7楼tzqdo于2011-04-19 10:39发表的 回 6楼(dbzhang800) 的帖子 :
为什么使用printf,是因为我要分割Tbuf这个字符串。
思路如下:
方法一.论坛里说mingw对宽字节支持不好(没有深究,表现为wcstok得到的结果始终不正确),然后我就想先把Tbuf转换为char *,即Tchar>>Qstring>>QString::toLatin1().data(),用strtok这个函数分割字符串。如果转换成功了,printf也就没问题了吧
方法二.Tbuf转为QString,直接使用QString::split.
.......


这都不是主要的,主要的是,你把一堆自己都没把握的东西混到一块了。

你不能写几个10行以内(或左右)的完整的测试程序自己单独测试一下么?
* 一方面有助于你发现和解决问题
* 另一方面有助于别人帮你解决问题

比如说,你前面的代码,别人如何相信你的 TCHAR 是wchar_t 而不是 char

注意细节,不要觉得无所谓。
离线tzqdo
只看该作者 9楼 发表于: 2011-04-19
回 8楼(dbzhang800) 的帖子
您的认真让我汗颜啊

其实是这样的,在我的程序里面,
TCHAR Tbuf[256];
char buf[256];
后面还有一句printf("Size of tbuf:%d,buf:%d\n",sizeof(Tbuf),sizeof(buf) );
得到结果如下

而且,把TCHAR Tbuf[256]换为wchar_t Tbuf[256],结果一样是错的
[ 此帖被tzqdo在2011-04-19 11:10重新编辑 ]
离线tzqdo
只看该作者 10楼 发表于: 2011-04-19
-_-|||
离线tzqdo
只看该作者 11楼 发表于: 2011-04-19
debug时,执行到DeviceGetControlResponse后面, Tbuf变量的内容很奇怪啊
[ 此帖被tzqdo在2011-04-19 12:21重新编辑 ]
离线tzqdo
只看该作者 12楼 发表于: 2011-04-19
看来,DeviceGetControlResponse 把TCHAR当char用了?
离线tzqdo
只看该作者 13楼 发表于: 2011-04-19
我汗,果然是,谢谢dbzhang800,问题解决
[ 此帖被tzqdo在2011-04-19 12:29重新编辑 ]
快速回复
限100 字节
 
上一个 下一个