0

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

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

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

4

1 回答 1

0

QChar包含一个ushortas only 成员,所以它的大小是sizeof(ushort).

QString上下文中,它表示 UTF-16“字符”(代码点)。

所以这里都是关于编码的。

如果您知道您char const *UTF-16数据与您的系统具有相同的字节顺序/字节顺序,只需复制它:

memcpy(q, c, 512);

如果您想QString用您的const char *数据初始化 a ,您可以使用以下命令将其解释为 UTF-16 QString::fromRawData()

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().

使用QStringUTF-8 我不知道有什么方法可以完全防止堆分配。但是上面提到的方式应该只分配两次:一次用于 PIMPL 的QString,一次用于 UTF-16 字符串数据。


如果您的输入数据编码为UTF-8,则答案是否定的:您无法使用 Qt 对其进行转换。

证明:查看qtbase/src/corelib/codecs/qutfcodec.cpp的源代码,我们看到所有用于编码/解码的函数都创建了新的 QString/QByteArray实例。没有函数在您的问题中对两个数组进行操作。

于 2019-04-05T11:50:13.560 回答