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 }
时间: 2024-10-12 22:07:01

QString 和 TCHAR 的相互转换的相关文章

【转】QT QString, wchar_t *, TCHAR, CString和其他字符或字符串类型的转化

//QString to wchar_t *: const wchar_t * encodedName = reinterpret_cast<const wchar_t *>(fileName.utf16()); //QString to char * given a file name: QByteArray fileName = QFile::encodeName(aFileName); const char * encodedName = fileName.constData(); //

QT5中QString与char *的相互转换

以例子说明: #include <QApplication> #include <QDebug> #include <QString> #include <QByteArray> int main(int argc, char *argv[]) { QApplication a(argc, argv); char abc[20]; memset(abc, 0, sizeof(abc)); QString str("hello world."

QString与char*的相互转换

在进行编程时,我们经常需要用到字符串这种类型,毫无疑问,Qt 库中也对字符串类型进行了封装,QString 类提供了你能想到的所有字符串操作方法,给开发者带来了极大方便. 但是我们在编写程序时,不可避免地会在 Qt 框架上使用第三方的开源库,由于库的类型基本上都是标准的类型,即使用 char * 来表示字符串类型.那么问题来了,QString 和 char * 之间如何进行转换呢? 下面分两种情况进行说明. 一.QString 转换为 char * 将 QString 转 char *,需要用到

QString, string, int, char* 之间相互转换

这三种数据类型在实际运用中经常需要互相转换,那么这里小结下它们之间的转换方法: - Qstring & string Qt中封装的类十分强大,其成员函数数量之多比STD有过之而无不及,许多程序员抱怨Qt非要整个自己的QSD,为啥不直接支持STD,但是我想说某些时候QST完全可以替代STD,就算不想完全替代,Qt也提供了完整而强大的相互转换的函数,下面我们先来看Qstring和string的相互转换. // string to QString std::string s = "hello

加载dll、lib库

2.是关于如何加载dll或lib库的.可以看这篇bog   Qt调用dll中的功能函数点击打开链接 **************************************************************************************************************************************************** 声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的.并且用我前两篇有

c++中的一些计算的问题

要实现小数的四舍五入, float a = 3.456; //保留到小数点后两位 float b =(int)((a * 100) + 0.5) / 100.0; 但是这样对负数不好使, 对负数的话, 这个帖子里还有办法: [C] C语言如何实现浮点数的四舍五入? int, float, double 与QString的转化: Qt中 int ,float ,double转换为QString QString与string的相互转换: 1.QString与int相互转换 QString qstr

QString与中文,QString与std::wstring的相互转换(使用fromStdWString和u8关键字)

Qt版本:5.5.1 Qt的QString功能丰富,对非英语语言的支持也不是问题,但支持得不够直接.例如,像 ? 1 QString str("死亡使者赛维"); 这样直接用带中文的字符串进行构造,那么用QMessageBox显示str时将出现乱码.如果使用fromLocal8Bit.fromLatin1这样的函数,又依赖本地计算机的显示语言,所以它们不是好方法. 显式地使用宽字符(wchar_t)或UTF-8才是好方法. ? 1 2 QString str0(QString::fro

QString转换成LPCWSTR

不知道大家用QT做什么程序,但应该还是Windows程序居多吧,仍免不了与WINAPI打交道.这就要求数据类型要与Windows一致,而QT的数据类型却是自成一体的.这就需要转换.比如我用到了LogonUser函数,其原型是: BOOL LogonUser( _In_      LPTSTR lpszUsername, _In_opt_  LPTSTR lpszDomain, _In_opt_  LPTSTR lpszPassword, _In_      DWORD dwLogonType,

CString, QString, char*之间的转换(包括VC编译开关)

传给未分配内存的const char* (LPCTSTR)指针. CString cstr(asdd); const char* ch = (LPCTSTR)cstr; ch指向的地址和cstr相同.但由于使用const保证ch不会修改,所以安全.2.传给未分配内存的指针. CString cstr = "ASDDSD"; char *ch = cstr.GetBuffer(cstr1.GetLength() + 1); cstr.ReleaseBuffer(); //修改ch指向的值