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



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

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

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

QChar包含一个仅作为成员的ushort,因此其大小为sizeof(ushort)

在上下文QString,它表示 UTF-16 "字符"(码位)。

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

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

memcpy(q, c, 512);

如果要使用const char *数据初始化QString,可以使用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()访问其内部存储器即可。

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


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

证明:查看 qtbase/src/corelib/codecs/qutfcodec 的源代码.cpp我们看到所有用于编码/解码的函数都会创建新的QString/QByteArray实例。没有函数像您的问题那样在两个数组上运行。

相关内容

  • 没有找到相关文章

最新更新