1、中文乱码
QT + msvc编译器版本默认编译的是字符串编码是ANSI,
而QTCreator默认创建的cpp字符串编码是UTF-8,然后msvc还是按ANSI去解析字符串常量,所以导致了中文乱码
解决方案:
使用notepad++把cpp编码从UTF-8转成 UTF-8带BOM
然后在pro加入下面脚本告诉msvc编译器,字符串常量是UTF-8编码,这样就不需要使用
QStringLiteral到处去包含字符串常量了
msvc {
QMAKE_CFLAGS += /utf-8
QMAKE_CXXFLAGS += /utf-8
}
2、API接口ANSI版本和Unicode版本
QString DwTool::GetExePath()
{
char szPath[_MAX_PATH];
::GetModuleFileName(NULL, szPath, _MAX_PATH);
return QString::fromLocal8Bit(szPath);
}
因为QT默认是Unicode编码,所以上面的代码实际上是下面这样,当然编译不通过了
QString DwTool::GetExePath()
{
char szPath[_MAX_PATH];
::GetModuleFileNameW(NULL, szPath, _MAX_PATH);
return QString::fromLocal8Bit(szPath);
}
解决方案1:
改成这样,使用ANSI版本windows api
QString DwTool::GetExePath()
{
char szPath[_MAX_PATH];
::GetModuleFileNameA(NULL, szPath, _MAX_PATH);
return QString::fromLocal8Bit(szPath);
}
或者改成这样,使用Unicode版本的windows api
QString DwTool::GetExePath()
{
TCHAR szPath[_MAX_PATH];
::GetModuleFileName(NULL, szPath, _MAX_PATH);
return QString::fromStdWString(szPath);
}
3、QString能接受参数为const char*的字符串
但是注意它接受的是utf-8编码的字符串,而不是ANSI编码的
#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
inline QT_ASCII_CAST_WARN QString(const char *ch)
: d(fromAscii_helper(ch, ch ? int(strlen(ch)) : -1))
{}
fromAscii_helper单步进去,就是QString::fromUtf8
如果还是按照MFC习惯,传入ANSI字符串给它,就会导致中文乱码
4、QString内部存储成UTF-8,若需要其它编码,都需要转换,常用的转换函数有
QString转ANSI
strServer.toLocal8Bit().data()
QString转UTF-8
strDateTime.toUtf8().data()
5、QString的trimmed函数和CString的Trim函数是不同的
QString的trimmed不会影响调用者,它是返回一个去除了空格符的新字符串
而CString的Trim是影响调用者
6、COleDateTime精度是秒,而QDateTime精度为毫秒
并且,Ado编程,设置时间值也会截断毫秒,但是看MSDN文档说是COledDateTime支持毫秒
我目前找不到办法,有找到的CSDN水友私信我,谢谢
7、多字节CString的GetLength和 QString的size函数
CString strA = "中国伟大复兴123abc"
strA.GetLength()为18 字节数
QString str = "中国伟大复兴123abc"
str.size()为12 字符数
而windows一些api需要传入的是字节数,一定要注意!!!!!!!!!!!
如果用QString想获取字节数,需要先转为QByteArray,再调用size()去获取字节数