zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    浅谈Charles —— 青花瓷
    jdbc
    装饰者模式
    java可变参数
    简单日历
    DVD管理系统
    图片拷贝
    时间输出
    java基础小知识
    jQuery HTML
  • 原文地址:https://www.cnblogs.com/qrlozte/p/4973080.html
Copyright © 2011-2022 走看看