Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换

Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型

在Qt下怎样将QString转char*呢,需要用到QByteArray类,QByteArray类的说明详见Qt帮助文档。

因为char*最后都有一个‘/0’作为结束符,而采用QString::toLatin1()时会在字符串后面加上‘/0’

方法如下:

Qstring  str;

char*  ch;

QByteArray ba = str.toLatin1();    

ch=ba.data();

这样就完成了QString向char*的转化。经测试程序运行时不会出现bug

用toLatin1好像不支持中文,用toLocal8Bit可以支持。

注意第三行,一定要加上,不可以str.toLatin1().data()这样一部完成,可能会出错。

 

补充:以上方法当QString里不含中文时,没有问题,但是QString内含有中文时,转换为char*就是乱码,采用如下方法解决:

方法1:

添加GBK编码支持:

#include <QTextCodec>

QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));

然后改变上面的第三行为:QByteArray ba = str.toLoacl8Bit();      toLoacl8Bit支持中文

方法2:

先将QString转为标准库中的string类型,然后将string转为char*,如下:

std::string str = filename.toStdString();

const char* ch = str.c_str();

 

我常用的方法:

char *QString_to_char(QString qstring)
{
 char *str=NULL;

 std::string str2=qstring.toStdString();

 str=(char *)malloc(str2.size()+1);
 if(str==NULL) return NULL;
 memset(str,NULL,str2.size()+1);
 strcat(str,(char *)str2.data());

 return str;
}
不过转换后事UTF-8编码的,可以再转换为其它编码格式:
wchar_t * ANSIToUnicode( const char* str ) 
{
 int textlen ;
 wchar_t * result;
 textlen = MultiByteToWideChar( CP_ACP, 0, str,-1, NULL,0 );
 result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));
 memset(result,0,(textlen+1)*sizeof(wchar_t));
 MultiByteToWideChar(CP_ACP, 0,str,-1,(LPWSTR)result,textlen );
 return result;
}

char * UnicodeToANSI( const wchar_t* str )
{
 char* result;
 int textlen;
 textlen = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL );
 result =(char *)malloc((textlen+1)*sizeof(char));
 memset( result, 0, sizeof(char) * ( textlen + 1 ) );
 WideCharToMultiByte( CP_ACP, 0, str, -1, result, textlen, NULL, NULL );
 return result;
}

wchar_t * UTF8ToUnicode( const char* str )
{
 int textlen ;
 wchar_t * result;
 textlen = MultiByteToWideChar( CP_UTF8, 0, str,-1, NULL,0 );
 result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));
 memset(result,0,(textlen+1)*sizeof(wchar_t));
 MultiByteToWideChar(CP_UTF8, 0,str,-1,(LPWSTR)result,textlen );
 return result;
}

char * UnicodeToUTF8( const wchar_t* str )
{
 char* result;
 int textlen;
 textlen = WideCharToMultiByte( CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL );
 result =(char *)malloc((textlen+1)*sizeof(char));
 memset(result, 0, sizeof(char) * ( textlen + 1 ) );
 WideCharToMultiByte( CP_UTF8, 0, str, -1, result, textlen, NULL, NULL );
 return result;
}

/*宽字符转换为多字符Unicode - ANSI*/

char* w2m(const wchar_t* wcs)
{
 int len;
 char* buf;
 len =wcstombs(NULL,wcs,0);
 if (len == 0) return NULL;
 buf = (char *)malloc(sizeof(char)*(len+1));
 memset(buf, 0, sizeof(char) *(len+1));
 len =wcstombs(buf,wcs,len+1);
 return buf;
}

/*多字符转换为宽字符ANSI - Unicode*/

wchar_t* m2w(const char* mbs)
{
 int len;
 wchar_t* buf;
 len =mbstowcs(NULL,mbs,0);
 if (len == 0) return NULL;
 buf = (wchar_t *)malloc(sizeof(wchar_t)*(len+1));
 memset(buf, 0, sizeof(wchar_t) *(len+1));
 len =mbstowcs(buf,mbs,len+1);
 return buf;
}

char* ANSIToUTF8(const char* str)
{
 return UnicodeToUTF8(ANSIToUnicode(str));
}

char* UTF8ToANSI(const char* str)
{
 return UnicodeToANSI(UTF8ToUnicode(str));
}