`
美丽的小岛
  • 浏览: 309245 次
  • 性别: 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 收到下位机16进制数转换字符串显示

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

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

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

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

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

    Qt中整形数组转换成字符串的问题.pdf

    在Qt开发中,有时我们需要将整型数组转换为字符串,以便于显示或...以上就是Qt中关于整型数组转换为字符串以及字符串与各种数据类型之间转换的相关知识点。通过这些方法,你可以灵活地在Qt应用中处理不同类型的数据。

    QString转换为TCHAR*

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

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

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

    QStrings.pas

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

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

    在Qt框架中,字符串处理是常见的任务,尤其是涉及到串口通信时,可能需要在QString与原始C风格的char *或QByteArray之间进行转换。QString是一个非常重要的类,它提供了Unicode字符串的支持,允许处理多种语言和字符...

    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 实现多功能字符串转换器,并易扩展新的转换器

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

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

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

    QString转ASCII(uint).txt

    QString提供了一个方便的方法`toLatin1()`,它可以将字符串转换为QByteArray,其中包含了以Latin1(ISO-8859-1,也是ASCII的超集)编码的字节序列。 要将QString转换为ASCII值,可以按照以下步骤操作: 1. 创建一...

Global site tag (gtag.js) - Google Analytics