`
美丽的小岛
  • 浏览: 297102 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

QString与各种字符串之间的转化

    博客分类:
  • QT
 
阅读更多

QString与char *的相互转化
QString str1 = "Test";
QByteArray ba = str1.toLatin1();
const char *c_str2 = ba.data();
printf("str2: %s", c_str2);
QString string = QString(QLatin1String(c_str2)) ;
或者


//中文Windows的缺省内码是GBK
// ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。而Unicode只与ASCII兼容(更准确地说,是与
// ISO-8859-1兼容),与GB码不兼容。例如“汉”字的Unicode编码是6C49,而GB码是BABA。

#define G2U(s) ( QTextCodec::codecForName("GBK")->toUnicode(s) )
#define U2G(s) ( QTextCodec::codecForName("GBK")->fromUnicode(s) )
QString str;
QCString cstr;
str = G2U("中文输入");
cstr = U2G(str);

▲qstring ->std::string 
qstring::toStdString() ,qstring::toStdWString()

▲ BSTR<->qstring 
typedef WCHAR OLECHAR;  typedef OLECHAR *BSTR;
BSTR(Basic STRing,Basic字符串)是一个OLECHAR*类型的Unicode字符串。它被描述成一个与自动化相兼容的类型。由于操作系统提供相应的API函数(如SysAllocString)来管理它以及一些默认的调度代码,因此BSTR实际上就是一个COM字符串,但它却在自动化技术以外的多种场合下得到广泛使用。LPSTR和LPWSTR是Win32和VC++所使用的一种字符串数据类型。LPSTR被定义成是一个指向以NULL(‘\0’)结尾的8位ANSI字符数组指针,而LPWSTR是一个指向以NULL结尾的16位双字节字符数组指针。
BSTR bstr_str;
qstring q_str((QChar*)bstr_str, wcslen(bstr_str))
bstr_str = SysAllocString(q_str.utf16())

▲ qstring<->LPCSTR
qstring::toLocal8Bit().constData()
QString fromLocal8Bit ( const char * str, int size = -1 )

▲ qstring<->LPCWSTR
qstring::utf16()
QString fromUtf16 ( const ushort * unicode, int size = -1 )

▲ qstring<->CString
CString c_str(qstring::utf16())
QString fromUtf16 (LPCTSTR(c_str) )   
CString cstr1 = "ASDDSD";
int strLength = cstr1.GetLength() + 1;
char *pValue = new char[strLength];
strncpy(pValue, cstr1, strLength);

以下引用的一个例子告诉我在不同的字符集字符串表示的不同

CString m_message("Hello!");
char szBuffer[4096];
memcpy( szBuffer, m_message, m_message.GetLength() );

发现输出szBuffer 的结果是"H",匪夷所思。
然后试了试常用的CString TO char的其他手段。

CString m_message("Hello!");
char *szBuffer = m_message.GetBuffer( m_message.GetLength() );

结果szBuffer指向"H"。
这就是说用CString给char赋值,是直接把第一个给char么?
答案出乎人意料,可以说是的,参阅《windows程序设计第5版》中的Unicode简介,可以得出这个结论。'H'的Unicode表示是一个双字节值0x0048。然而,因为Intel微处理器从最小的字节开始储存多字节数值,该字节实际上是以0x48、0x00的顺序保存在内存中。
字符串"Hello!"的Unicode表示为:

0x0048 0x0065 0x006C 0x006C 0x006F 0x0021

它在计算机里的存储为:

48 00 65 00 6C 00 6C 00 6F 00 21 00

这就是说当他传递给char时,赋值时读到第二个字节00时就会当作'\0'截断掉后面的数据了。所以CString“Hello!”赋值给char字符串当然是“H”了。
可是当使用VC6.0时这个问题却不存在。那是因为VC6.0默认使用的字符集是ANSI编码,而VS2008默认使用的是多字节字符集。这个可以在项目->工程属性->常规->字符集里设置。
若改成多字节字符集,上述代码就没问题了。
当然也可以不改字符集来解决这个代码。在字符串类中,有如下对应关系:
字符串类      字符集   赋值函数

CStringA       char           strcpy 
CStringW     WCHAR      wcscpy
CString        _TCHAR     _tcscpy

#ifdef _UNICODE
        typedef wchar_t TCHAR    ;
#else
        typedef char TCHAR;
#endif

CStringA是任何字符集设置下都是用多字节字符集,CStirngW是任何设置下都是用宽字符集(Unicode),CString就是视编译器设置而定。故可以这么修改代码:

CStringA m_message("Hello!");
char szBuffer[4096];
strcpy( szBufer, m_message);

分享到:
评论
1 楼 美丽的小岛 2014-08-27  
LPCTSTR类型:
L表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32位操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。
P表示这是一个指针
C表示是一个常量
T表示在Win32环境中, 有一个_T宏
STR表示这个变量是一个字符串

相关推荐

    863568206#guang.github.io#2019-7-26-QString与C++字符串类型的相互转换1

    TCHAR *类型转为QString类型:QString WcharToChar(const TCHAR* wp, size_t codePage = CP_A

    time_t 与字符串之间的相互转换

    转本文介绍了标准C/C++中的有关日期和时间的概念,并通过各种实例讲述了这些函数和...笔者认为,和时间相关的一些概念是相当重要的,理解这些概念是理解各种时间格式的转换的基础,更是应用这些函数和数据结构的基础。

    QString含汉字时,完美转char*和unsigned char*

    此为QString无损转char*和unsigned char* 。 当QString内容包含汉字时,转换char*等会发生...使用后char*与unsigned char*的qDebug()输出与QString输出结果相同。 注意,该函数返回unsigned char*使用完毕后记得delete。

    Qt中QString转换成const char * ()、QByteArray等方法

    在Qt下写串口字符串读写方面的程序,里面需要处理一些QString和字符数组等方面的字符处理。 QString: QString类提供Unicode字符串。 QString存储一个16位QChars字符串,其中每个QChar对应一个Unicode 4.0字符。...

    一个字符串处理库

    包括字符串比较、字符大小写转换、OEM(Dos)和ANSI(Windows)互换、查找、替换、删除子串、删除字符、格式化、子串剪裁、字节字符串处理、整数和字符串互换等等许多有用的函数 包含一个机器翻译的声明文件

    QtQStringFunEx.zip

    toUpper() 将字符串的字母全部转换为大写字母 toLower() 将字符串的字母全部转换为大写字母 left() 返回包含字符串中最左n个字符的子字符串。如果n大于或等于size()或小于零,则返回整个字符串。 right() 返回包含...

    CRC16的demo程序-QString类型16进制转换为ByteArray-每两位数据增加空格

    可以获取textEdit上的QString类型16进制数转换为ByteArray; 输入数据错误判断及提示; CRC16校验计算公式; 计算ByteArray的crc16结果; 结果转换为QString,并且每两位数据都需要增加空格展示; 输入清除功能; ...

    json字符串之间的相互转换示例代码

    主要介绍了json 字符串之间的相互转换 ,通过eval&#40;&#41;函数可以将JSON字符串转化为对象,本需要的朋友可以参考下

    Qt5开发及实例-CH1502.rar,Qt5测试字符串转换为全小写字符的功能代码

    Qt5开发及实例,实例CH1502,测试字符串转换为全小写字符的功能。 (1)建立单元测试框架(操作方法同前),具体设置如下。 项目名称:TestQString。 测试类名:TestQString。 测试槽:testToLower。 生成源文件:tst_...

    基于C++实现的阶谓词产生式系统,实现植物识别的正向推理过程源码+文档说明.zip

    infer类的对象在初始化时按行读取规则,使用QFile的readLine()函数,将每条规则转化为一个QString字符串并存入QVector容器中,提供给后去函数进行处理。知识库格式如图: - 不懂运行,下载完可以私聊问,可远程教学 ...

    精通qt4编程(源代码)

    \13.2.5 字符串的转换 338 \13.3 QVariant 339 \13.4 Qt的算法 341 \13.5 正则表达式 342 \13.5.1 基本的正则表达式 342 \13.5.2 文字捕获 344 \13.6 小结 345 \高 级 篇 \第14章 XML 348 \14.1 DOM 348 \14.1.1 DOM...

    精通Qt4编程(第二版)源代码

    \13.2.5 字符串的转换 338 \13.3 QVariant 339 \13.4 Qt的算法 341 \13.5 正则表达式 342 \13.5.1 基本的正则表达式 342 \13.5.2 文字捕获 344 \13.6 小结 345 \高 级 篇 \第14章 XML 348 \14.1 DOM 348 \...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    加入的这个函数的作用就是移除字符串开头和结尾的空白字符。 12.最后,如果输入错误了,重新回到登录对话框时,我们希望可以使用户名和 密码框清空并且光标自动跳转到用户名输入框,最终的登录按钮的单击事件的槽 ...

Global site tag (gtag.js) - Google Analytics