将多字节字符数组转换为QChar数组

时间:2019-04-05 09:34:09

标签: qt multibyte qchar

我有两个缓冲区(示例大小):

char c[512];
QChar q[256];

假设“ c”包含多字节字符串(UTF-8)。我需要将其转换为QChar序列并将其放置在“ q”中。 我想我需要的一个很好的例子可能是MultiByteToWideChar函数。
重要提示:此操作不得涉及任何显式或隐式的内存分配,除非可能是堆栈上的其他分配。 如果您不确定以上含义,请不要回答。

1 个答案:

答案 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实例。正如您所问的那样,没有函数对两个数组进行操作。