QString 和 TCHAR 的相互转换

参考资料:

 

http://www.cnblogs.com/fuyanwen/p/3200536.html
http://www.cnblogs.com/wendao/archive/2012/07/27/2612597.html

不能直接用:

QString szqFileName = QString::fromLocal8Bit("data");
const char* szName = szqFileName.toLocal8Bit().constData(); // 返回的 QByteArray 被析构掉了, szName 会指向无效的内存区

正确的做法:

QString szqFileName = QString::fromLocal8Bit("data");
QByteArray ba = szqFileName.toLocal8Bit();
const char* szName = ba.constData();

代码(在我的系统上, Win7 x64. CHS. 第21, 40行如果我用utf8的话就会乱码), 下载DEMO:

注: 关于UNICODE宏的设置

 1 #include <iostream>
 2 
 3 #include <Windows.h>
 4 #include <QtCore/QtCore>
 5 
 6 #ifdef UNICODE
 7 #define FILE_NAME "数据.txt"
 8 #else
 9 #define FILE_NAME "data.txt"
10 #endif
11 
12 int main()
13 {
14     QString szqFileName = QString::fromLocal8Bit(FILE_NAME);
15     qint64 nLen = szqFileName.length();
16     //
17     // QString to TCHAR*
18     //
19     LPCTSTR szFileName = NULL;
20 #ifdef UNICODE
21     szFileName = (wchar_t*)szqFileName.utf16();
22 #else
23     QByteArray byteArray = szqFileName.toLocal8Bit();
24     szFileName = byteArray.constData();
25 #endif // UNICODE
26     //
27     // Create file
28     //
29     HANDLE hFile = ::CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
30     if (hFile == INVALID_HANDLE_VALUE)
31         std::cout << "Cannot create file." << std::endl;
32     else
33         std::cout << "File created." << std::endl;
34     ::CloseHandle(hFile);
35     //
36     // TCHAR* to QString
37     //
38     szFileName = TEXT(FILE_NAME);
39 #ifdef UNICODE
40     szqFileName = QString::fromUtf16((ushort*)szFileName);
41 #else
42     szqFileName = QString::fromLocal8Bit(szFileName);
43 #endif
44     QFile file(szqFileName);
45     if (!file.remove())
46         std::cout << "Cannot remove file." << std::endl;
47     else
48         std::cout << "File removed." << std::endl;
49     
50     return 0;
51 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值