`
美丽的小岛
  • 浏览: 308148 次
  • 性别: 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表示这个变量是一个字符串

相关推荐

    QStrings 快速字符串处理单元

    1. **字符串创建与初始化**:QString可以通过字面量、字符数组、其他字符串或C风格的字符串进行初始化。例如,`QString str = "Hello, World!";` 或 `QString str2 = QLatin1String("你好,世界!");`。 2. **字符...

    QT字符串设置固定宽度,前位补0.7z

    例如,如果你有一个整数`num = 12`,你可以用`QString str = QString::number(num)`将其转换为字符串。 然后,`rightJustified()`方法用于将字符串右对齐并填充指定的字符。它接受两个参数:一个是期望的总宽度,另...

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

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

    05 QString字符串处理及中文乱码问题处理.zip

    这篇教程“05 QString字符串处理及中文乱码问题处理”显然会深入探讨如何在Qt应用中有效地管理和解决中文乱码问题。 首先,QString的构造和基本操作是其核心内容。你可以通过各种方式创建一个QString对象,比如直接...

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

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

    QT中字符串的比较、查找、替换等操作 - 大存的博客1

    使用`sprintf()`函数可以进行格式化的字符串输出,如`s5.sprintf("%s","Welcome to my world")`,这与C语言中的`printf`类似,允许我们将变量或文本插入到字符串中。 3. **字符串插入选项**: `insert()`函数可以...

    QT 收到下位机16进制数转换字符串显示

    你可以使用`QByteArray::fromHex()`或`QString::toLatin1()`方法将16进制字符串转换为字节序列,再通过`QByteArray::toInt()`将其转换为整数。 3. **转换为字符串**:将得到的十进制数值转换为16进制字符串。可以...

    cJSON库(json格式字符串进行转化)

    接着,我们创建了一个新的JSON对象,并添加了"name"和"age"字段,最后将其转换回JSON字符串并打印。 **6. 注意事项** 使用cJSON库时,要注意以下几点: - cJSON不检查内存溢出,确保有足够的内存分配。 - 解析后的...

    QString转换为TCHAR*

    当需要将QString转换为非Unicode(ASCII)字符串时,可以使用`toLocal8Bit()`函数,它返回一个QByteArray对象,然后可以将这个字节数组转换为char*。但是这种方法不适用于Unicode环境,因为它会丢失Unicode信息。 ...

    汉字字符串拼音排序-QT、C++

    在IT行业中,编程语言如C++和库如QT经常被用来处理各种数据操作,包括字符串的排序。在中文环境中,由于汉字的特性,拼音排序成为一种实用的需求,特别是在需要按照汉字拼音首字母来排列字符串的场景下。"汉字字符串...

    QStrings.pas

    5. **大小写转换**:`UpperCase`和`LowerCase`函数可以快速地将字符串转换为大写或小写。 6. **字符串比较**:`CompareText`函数可以忽略字符的大小写进行比较,`SameText`函数则判断两个字符串是否内容相同。 除此...

    QString转ASCII

    总结一下,QString与ASCII之间的转换是通过QString的`toUtf8()`方法将其转换为QByteArray,然后可以遍历该字节数组来处理ASCII字符。这个过程在处理包含ASCII字符的字符串时非常有用,尤其是在跨平台或与不同编码...

    QGBK.zip_QT转换字符串源码

    "QGBK.zip_QT转换字符串源码"这个压缩包显然包含了与QT库相关的字符串转换源代码,可能是一个小型的实用工具或者示例代码,用于帮助开发者处理字符串在不同编码格式间的转换,特别是针对GBK编码的情况。 首先,我们...

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

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

    Qt中QString、QByteArray、int、double之间转换 - 苦涩的茶 - 博客园1

    总结来说,Qt提供了便捷的方法在QString、QByteArray、int和double之间进行转换,这在处理各种数据类型时非常有用。在实际编程中,根据需求选择合适的转换方式,并注意检查转换的正确性,以确保数据的准确无误。

    Qt 实现多功能字符串转换器,并易扩展新的转换器

    在本文中,我们将深入探讨如何使用Qt框架来创建一个多功能字符串转换器,它不仅具有基本的字符串转换功能,还设计得易于扩展以适应未来的转换需求。这个转换器项目利用了Qt强大的C++库,提供了良好的代码组织和测试...

    Qt中的字符编码转换:UTF8、Unicode、GBK、ASCII、16进制字符、16进制数值

    但如果需要,可以使用`QString::toUtf8()`将Unicode字符串转换为UTF-8字节序列。 5. **16进制数值转换**:在串口通信中,可能需要将接收到的16进制数值转换为字符或字符串。例如,函数`QByteArray_to_HexQString`将...

    四、Qt字符串与数值.zip

    3. **格式化输出**:`QString::number()`函数用于将数值转换为字符串,并可指定基数(二进制、八进制、十进制、十六进制)、精度、填充字符等。 4. **字符串操作**:QString类提供了丰富的成员函数,如`append()`, ...

Global site tag (gtag.js) - Google Analytics