我有两个缓冲区(示例大小):
char c[512];
QChar q[256];
假设“ c”包含多字节字符串(UTF-8)。我需要将其转换为QChar序列并将其放置在“ q”中。
我想我需要的一个很好的例子可能是MultiByteToWideChar函数。
重要提示:此操作不得涉及任何显式或隐式的内存分配,除非可能是堆栈上的其他分配。
如果您不确定以上含义,请不要回答。
答案 0 :(得分:0)
QChar
仅包含一个ushort
作为成员,因此其大小为sizeof(ushort)
。
在QString
上下文中,它表示UTF-16'字符'(代码点)。
因此,这全都与编码有关。
如果您知道char const *
是 UTF-16 数据,且其字节序/字节顺序与系统相同,则只需将其复制:
memcpy(q, c, 512);
如果您要使用QString
数据初始化const char *
,则可以使用QString::fromRawData()
将其解释为UTF-16:
QString strFromData = QString::fromRawData(reinterpret_cast<QChar*>(c), 256);
// where 256 is sizeof(c) * sizeof(char) / sizeof(QChar)
然后,您甚至不需要QChar q[256]
数组。
如果您知道数据是 UTF-8 ,则应使用QString::fromUtf8()
,然后只需使用QString::constData()
访问其内部内存即可。
将QString
与UTF-8一起使用我不知道有什么方法可以完全防止堆分配。但是,上述方法只能分配两次:一次用于QString
的PIMPL,一次用于UTF-16字符串数据。
如果您输入的数据编码为UTF-8
,则答案为否:您无法使用Qt对其进行转换。
证明:查看qtbase/src/corelib/codecs/qutfcodec.cpp的源代码,我们发现所有用于编码/解码的函数都创建了 new QString
/ QByteArray
实例。正如您所问的那样,没有函数对两个数组进行操作。