将 QStringList 打包到 QString 并解压缩回来

Pack QStringList to QString and unpack it back

本文关键字:解压缩 回来 QString QStringList      更新时间:2023-10-16

我正在寻找一种简单万无一失的方法来将任意QStringList转换为单个QString并返回。

QStringList fruits;
fruits << "Banana", "Apple", "Orange";
QString packedFruits = pack(fruits);
QStringList unpackFruits = unpack(packedFruits);
// Should be true 
// fruits == unpackFruits;
对于

此类问题,最简单的解决方案是什么?

QStringListQString - QStringList::join

将所有字符串列表的字符串

联接到单个字符串中,每个元素由给定的分隔符(可以是空字符串)分隔。

QString pack(QStringList const& list)
{
    return list.join(reserved_separator);
}

QStringQStringList - QString::split

将字符串

拆分为子字符串,无论出现sep,并返回这些字符串的列表。如果 sep 在字符串中的任何位置都不匹配,则split()返回包含此字符串的单元素列表。

QStringList unpack(QString const& string)
{
    return string.split(reserved_separator);
}

前面的答案提到QString::splitQStringList::join这是正确的方法,但是如果您选择的分隔符包含在任何字符串中,它将破坏您的转换。

必须使用以下方法之一防止列表中的字符串包含分隔符:

  • 如果任何字符串包含分隔符,则在 QStringList::join 之前抛出错误
  • 确保它们不能包含分隔符(例如,存储字符串及其QByteArray::toHex(myString.toLatin1())表示形式,然后使用字符超出范围 0..9 和 a. 的分隔符。f.然后用QString::fromLatin1(QByteArray::fromHex(myHexString))转换回来
  • 无论字符串是否包含分隔符,都可以使用任何分隔符,但在 join() 之前为其实现转义逻辑,在 split() 之后实现取消转义逻辑,以便在连接时分隔符永远不会出现在任何字符串中,但将恢复它的所有实例。

使用 QStringList::join() :

QStringList strList;
strList << "Banana" << "Apple" << "Orange" ;
QString str = strList.join("");  // str = "BananaAppleOrange";
str = strList.join(",");  // str = "Banana,Apple,Orange";