将多字节字符数组转换为 QChar 数组
Convert multibyte character array to QChar array
我有两个缓冲区(示例大小):
char c[512];
QChar q[256];
假设'c'包含多字节字符串(UTF-8)。我需要将它转换为 QChar 序列并将它放在 'q' 中。
我想我需要的一个很好的例子可能是 MultiByteToWideChar 函数。
重要提示:此操作不得涉及任何显式或隐式内存分配,除了堆栈上的额外分配,可能。
如果您不确定以上内容的含义,请不要回答。
QChar
包含一个 ushort
作为唯一的成员,所以它的大小是 sizeof(ushort)
.
在 QString
上下文中,它表示 UTF-16 'characters'(代码点)。
所以这里都是关于编码的。
如果您知道您的 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()
.[=30 访问其内部内存=]
Using QString
with UTF-8 我不知道有什么方法可以完全阻止堆分配。但上述方式应该只分配两次:一次为QString
的PIMPL,一次为UTF-16字符串数据。
如果你的输入数据编码为UTF-8
,答案是否:你不能使用Qt转换它。
证明:查看 qtbase/src/corelib/codecs/qutfcodec.cpp 的源代码,我们看到所有用于编码/解码的函数都创建 new QString
/ QByteArray
实例。没有函数像您的问题那样对两个数组进行操作。
我有两个缓冲区(示例大小):
char c[512];
QChar q[256];
假设'c'包含多字节字符串(UTF-8)。我需要将它转换为 QChar 序列并将它放在 'q' 中。
我想我需要的一个很好的例子可能是 MultiByteToWideChar 函数。
重要提示:此操作不得涉及任何显式或隐式内存分配,除了堆栈上的额外分配,可能。
如果您不确定以上内容的含义,请不要回答。
QChar
包含一个 ushort
作为唯一的成员,所以它的大小是 sizeof(ushort)
.
在 QString
上下文中,它表示 UTF-16 'characters'(代码点)。
所以这里都是关于编码的。
如果您知道您的 char const *
是 UTF-16 数据,与您的系统具有相同的字节序/字节顺序,只需复制它:
memcpy(q, c, 512);
如果您想用 const char *
数据初始化 QString
,您可以使用 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()
.[=30 访问其内部内存=]
Using QString
with UTF-8 我不知道有什么方法可以完全阻止堆分配。但上述方式应该只分配两次:一次为QString
的PIMPL,一次为UTF-16字符串数据。
如果你的输入数据编码为UTF-8
,答案是否:你不能使用Qt转换它。
证明:查看 qtbase/src/corelib/codecs/qutfcodec.cpp 的源代码,我们看到所有用于编码/解码的函数都创建 new QString
/ QByteArray
实例。没有函数像您的问题那样对两个数组进行操作。